首页 > 解决方案 > 如何根据另一个数组更新Javascript数组中的值?

问题描述

不知道发生了什么,但只能猜测它是一些奇怪的参考问题而不是副本。我有两个数组。一个有一个 orderIndex,我想用它来更新排序的数组值。

这以某种方式使所有 orderIndexes 成为第一个值(在本例中为 2)。有人知道发生了什么吗?

const array = [{
  orderIndex: 2,
  name: "blah"
}, {
  orderIndex: 1,
  name: "blah"
}, {
  orderIndex: 3,
  name: "blah"
}]


function compare(a, b) {
  if (a.orderIndex < b.orderIndex) {
    return -1;
  }
  if (a.orderIndex > b.orderIndex) {
    return 1;
  }
  return 0;
}

// I make a sorted array
tempArray = [...array]

// this sorts the array based on orderIndex
tempArray.sort(compare)

// I then loop through and update the original array
for (let i = 0; i < array.length; i++) {
  array[i].orderIndex = tempArray[i].orderIndex
}

标签: javascriptarrayssorting

解决方案


这里的参考问题[...array]是制作浅拷贝,而不是深拷贝。因此arraytempArray两者都包含指向内存中相同对象的指针,因此当你运行时array[i].orderIndex = tempArray[i].orderIndex,你实际上是在改变两个数组中的对象。

对此的解决方案很少:

使用 lodash 进行深层复制:

import _ from 'lodash';
tempArray = _.cloneDeep(array)

对数组进行就地排序:

array = _.sortBy(array, 'orderIndex')

或者在尝试变异之前将 orderIndex 的排序存储为基元数组

orderIndexes = [...array].sort(compare).map(object => object.orderIndex)
for (let i = 0; i < array.length; i++) {
  array[i].orderIndex = orderIndexes[i]
}

推荐阅读