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

使用更新数组对象

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

    id 属性匹配,替换数组 x y 项目。

    我可以很容易地从一个普通的老人身上做到这一点 循环。但我不明白为什么我的

    let x1 = [{
      id: '1',
      a: 1,
      b: 2
    }];
    
    let y1 = [{
      id: '1',
      c: 3,
      b: 2
    }];
    
    let x2 = [{
      id: '1',
      a: 1,
      b: 2
    }];
    
    let y2 = [{
      id: '1',
      c: 3,
      b: 2
    }];
    
    
    
    let updateX1 = (x, y) => {
    
      for (let itemY of y) {
    
        for (let itemX of x) {
    
          if (itemY.id === itemX.id) {
            itemX = itemY;
          }
        }
      }
    
      return x;
    }
    
    let updateX2 = (x, y) => {
    
      for (let i = 0; i < y.length; i++) {
    
        for (let j = 0; j < x.length; j++) {
    
          if (y[i].id === x[j].id) {
            x[j] = y[i];
          }
        }
      }
    
      return x;
    }
    
    console.log(updateX1(x1, y1));
    console.log(updateX2(x2, y2));

    为什么上面两种方法会得到两种不同的结果?提前谢谢!

    2 回复  |  直到 7 年前
        1
  •  5
  •   CertainPerformance    7 年前

    重新分配一个变量本身永远不会改变现有的对象,或者至少不会超出非常奇怪的情况。当你这么做的时候

    itemX = itemY;
    

    itemX 变量指向 itemY 项目X ,以及 项目X 来自,不会改变。为了改变对象,必须始终显式地为 财产 对象的,例如 obj.foo , obj['foo'] x[j] = y[i]; .

        2
  •  1
  •   HMR    7 年前

    如果你想做的实际上是你说的:

    如果id属性匹配,则用数组y替换数组x项 项目

    然后您可以使用 map find :

    const x = [
      { id: 1, name: 'should be replaced by y' },
      { id: 2, name: 'not replaced' },
    ];
    const y = [
      { id: 1, name: 'this is from y' },
      { id: 3, name: 'not not used' },
    ];
    
    const newX = x.map((xItem) => {
      const fromY = y.find((yItem) => yItem.id === xItem.id);
      return fromY ? fromY : xItem;
    });
    console.log(newX);

    如果你想要的是突变,那么你可以使用 forEach 因为这对副作用更合适

    const x = [
      { id: 1, name: 'should be replaced by y' },
      { id: 2, name: 'not replaced' },
    ];
    const y = [
      { id: 1, name: 'this is from y' },
      { id: 3, name: 'not not used' },
    ];
    //mutate x
    x.forEach((xItem, index) => {
      const fromY = y.find((yItem) => yItem.id === xItem.id);
      x[index] = fromY ? fromY : xItem;
    });
    console.log(x);