javascript - 原始数组已更改,未进行任何修改

标签 javascript arrays

我正在尝试从数组中删除重复的对象,并仅保留具有最高 nb 值的对象。

示例:

从此数组:

let arr = [
      {id: 1, nb: 1},
      {id: 1, nb: 4},
      {id: 2, nb: 1},
      {id: 3, nb: 1},
      {id: 1, nb: 2},
      {id: 1, nb: 3},
      {id: 2, nb: 7},
      {id: 2, nb: 8},
    ];

我应该得到这个:

arr2 = [
   { id: 1, nb: 4 },
   { id: 2, nb: 8 }, 
   { id: 3, nb: 1 }
]

下面的算法在理论上是非常正确的,但是我看到原始数组最后被修改了(参见下面最后一个 console.log(arr)):

代码:

let arr = [
  {id: 1, nb: 1},
  {id: 1, nb: 4},
  {id: 2, nb: 1},
  {id: 3, nb: 1},
  {id: 1, nb: 2},
  {id: 1, nb: 3},
  {id: 2, nb: 7},
  {id: 2, nb: 8},
];
// Original array
console.log(arr);

let tmp = {};
for(let i=0; i<arr.length; i++) {
  if( !tmp[arr[i].id] ) {
    tmp[arr[i].id] = arr[i];     
  } else {
    if (tmp[arr[i].id].nb < arr[i].nb ) {
      tmp[arr[i].id].nb = arr[i].nb;
    }
  }     
}

var result = Object.values(tmp);
// This output the desired result
console.log(result);
// Why the original array changed ?
console.log(arr);

这将输出:

> Array [Object { id: 1, nb: 1 }, Object { id: 1, nb: 4 }, Object { id: 2, nb: 1 }, Object { id: 3, nb: 1 }, Object { id: 1, nb: 2 }, Object { id: 1, nb: 3 }, Object { id: 2, nb: 7 }, Object { id: 2, nb: 8 }]
> Array [Object { id: 1, nb: 4 }, Object { id: 2, nb: 8 }, Object { id: 3, nb: 1 }]
> Array [Object { id: 1, nb: 4 }, Object { id: 1, nb: 4 }, Object { id: 2, nb: 8 }, Object { id: 3, nb: 1 }, Object { id: 1, nb: 2 }, Object { id: 1, nb: 3 }, Object { id: 2, nb: 7 }, Object { id: 2, nb: 8 }]

除了循环之外没有任何处理的情况下,为什么原始数组会改变?

最佳答案

原始数组最终更新,因为 tmp 映射和 arr 中的对象共享相同的对象引用。因此,在 tmp 中所做的更改将反射(reflect)在 arr 中。您可以使用Object.assign()使它们指向单独的引用。请尝试以下操作:

let arr = [ {id: 1, nb: 1}, {id: 1, nb: 4}, {id: 2, nb: 1}, {id: 3, nb: 1}, {id: 1, nb: 2}, {id: 1, nb: 3}, {id: 2, nb: 7}, {id: 2, nb: 8}, ];


let tmp = {};
for(let i=0; i<arr.length; i++) {
  if( !tmp[arr[i].id] ) {
    tmp[arr[i].id] = Object.assign({},arr[i]);     
  } else {
    if (tmp[arr[i].id].nb < arr[i].nb ) {
      tmp[arr[i].id].nb = arr[i].nb;
    }
  }     
}

var result = Object.values(tmp);
console.log(result)

关于javascript - 原始数组已更改,未进行任何修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52164066/

相关文章:

javascript - javaScript, CSS , HTML , jQuery 测试工具

javascript - Internet Explorer 8 event.wheelDelta 问题

javascript - 多个 PhantomJS 实例挂起

arrays - 无法分配给属性 : 'itemArray' is a get-only property

delphi - 对数组进行排序的最佳方法

javascript - 在javascript中生成带有键值的多维数组

javascript - 我的 javascript 需要什么条件?它是一个脚本,弹出一个对话框,其中包含字段留空的表单验证备注

c - 如何求两组数据的平均值?

Javascript - 无法推送到内部对象

c - 如何使用函数扫描二维数组而不删除其内容