代码之家  ›  专栏  ›  技术社区  ›  user944513

更新对象数组的另一种方法是什么?

  •  0
  • user944513  · 技术社区  · 7 年前

    我有一组对象。我想更新一个 object 使用 id .

    我可以用 map 功能。是否有其他方法或更有效的方法更新阵列?

    这是我的代码: https://stackblitz.com/edit/js-xgfwdw?file=index.js

    var id = 3
    var obj = {
      name: "test"
    }
    let arr = [{
      name: "dd",
      id: 1
    }, {
      name: "dzxcd",
      id: 3
    }, {
      name: "nav",
      id: 5
    }, {
      name: "hhh",
      id: 4
    }]
    
    function getUpdated(obj, id) {
      var item = [...arr];
      const t = item.map((i) => {
        if(i.id==id){
          return {
            ...obj,
            id
          }
        }else {
          return i;
        }
      })
      return t
    }
    
    console.log(getUpdated(obj,id))
    

    预期的输出是正确的,但我希望使用另一种方法实现相同的功能。

    [{
          name: "dd",
          id: 1
        }, {
          name: "test",
          id: 3
        }, {
          name: "nav",
          id: 5
        }, {
          name: "hhh",
          id: 4
        }]
    
    4 回复  |  直到 7 年前
        1
  •  3
  •   Prince Hernandez    7 年前

    你的方法是正确的,基本上你所做的坏事就是创建新的数组 [...arr] ,当map已经给您一个新数组时。

    其他要使用的东西,可以是三元运算符,直接返回结果的 map 功能

    在这里检查 improvedGetUpdate :

    var id = 3;
    
    var obj = {
      name: "test"
    };
    
    let arr = [{
      name: "dd",
      id: 1
    }, {
      name: "dzxcd",
      id: 3
    }, {
      name: "nav",
      id: 5
    }, {
      name: "hhh",
      id: 4
    }]
    
    function getUpdated(obj, id) {
      var item = [...arr];
      const t = item.map((i) => {
        if (i.id == id) {
          return {
            ...obj,
            id
          }
        } else {
          return i;
        }
      })
      return t
    }
    
    improvedGetUpdate = (obj, id) => arr.map(i => {
      return i.id !== id ? i : {
        ...obj,
        id
      }
    })
    
    console.log(getUpdated(obj, id))
    console.log(improvedGetUpdate(obj, id))
        2
  •  2
  •   Eugenio Valeiras    7 年前

    var id = 3
    var obj = {
      name: "test"
    }
    let arr = [{
      name: "dd",
      id: 1
    }, {
      name: "dzxcd",
      id: 3
    }, {
      name: "nav",
      id: 5
    }, {
      name: "hhh",
      id: 4
    }]
    
    const result = arr.map((el) => el.id === id ? {...obj, id} : el)
    
    console.log(result);
        3
  •  1
  •   quirimmo    7 年前

    使用 splice 也可用于更新数组的方法:

    var obj = {
      id: 3,
      name: "test"
    }
    let arr = [{
      name: "dd",
      id: 1
    }, {
      name: "dzxcd",
      id: 3
    }, {
      name: "nav",
      id: 5
    }, {
      name: "hhh",
      id: 4
    }]
    
    arr.splice(arr.findIndex(({id}) => id === obj.id), 0, obj);
    console.log(arr);
        4
  •  0
  •   eustatos    7 年前

    @Quirimmo建议使用短代码。 我建议快速编码。

    var id = 3;
    var obj = {
      id:   3,
      name: "test"
    }
    let arr = [{
      name: "dd",
      id: 1
    }, {
      name: "dzxcd",
      id: 3
    }, {
      name: "nav",
      id: 5
    }, {
      name: "hhh",
      id: 4
    }]
    var arr2 = [...arr];
    console.time('⏱');
    arr.splice(arr.findIndex(({id}) => id === obj.id), 0, obj);
    console.timeEnd('⏱');
    console.time('⏱');
    for (let item of arr2) {
      if (item.id === id) {
        item.name = obj.name;
        break;
      }
    }
    console.timeEnd('⏱');
    console.log(arr2);