javascript - 如何根据另一个数组更新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
}
解决方案
这里的参考问题[...array]
是制作浅拷贝,而不是深拷贝。因此array
,tempArray
两者都包含指向内存中相同对象的指针,因此当你运行时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]
}
推荐阅读
- c# - 依赖关系更改导致缺少对旧文件的引用
- mysql - 使用 MySQL 和 RDS 创建 JOBS
- mysql - 从 AWS EC2 MySQL 数据库迁移到 Azure MySQL 数据库导致性能非常差
- javascript - 选择选项的基于 HTML 条件的验证不起作用
- amazon-web-services - AWS EC2 - 尝试上传新文件时 FTP 返回错误 451
- django - django:FooSearchListView'对象没有属性'object_list'
- node.js - file.createReadStream 不支持在 nodejs 中读取谷歌云存储图像
- mqtt - MQTT 集群信息
- ruby-on-rails - Ruby 函数搜索栏
- r - 如何从 R 中的面板数据中删除不平衡组