并列表.找到并返回一份副本

Does List.find return a copy

本文关键字:一份 副本 列表 返回      更新时间:2023-09-26

我希望通过查找和设置返回值来更新users中的用户。但是,console.log(overview[userI]);不返回打印null

var user = users.find(u => u.id===newUser.id);
var userI = users.findIndex(u => u.id===newUser.id);
user = null;
console.log(overview[userI]);

然后运行如下示例:

var inventory = [
    {name: 'apples', quantity: 2},
    {name: 'bananas', quantity: 0},
    {name: 'cherries', quantity: 5}
];
function findCherries(fruit) {
    return fruit.name === 'cherries';
}
let fruit = inventory.find(findCherries); // { name: 'cherries', quantity: 5 }
fruit.quantity = 6;
console.log(inventory);

然而,这次inventory确实如我所期望的那样更新了cherries,现在的值为6。

为什么我在第一个例子中没有看到这种行为?

将先前有对象引用作为值的变量赋值为null,对该对象不起任何作用:

a = { test: 1 };
b = a;
b = null; // this does not influence the value of a.

在上面的例子中,首先让b共享a的值,然后又按自己的方式运行。这两次赋值都没有改变a的值。

但是当你改变一个对象时,这当然会被所有对同一对象的引用注意到:

a = { test: 1 };
b = a;
b.test = 2; 
console.log(a.test) // 2

那么在你的例子中,如果你想让你的users数组得到一个元素被null替换,你需要改变数组:

var userI = users.findIndex(u => u.id===newUser.id);
if (userI > -1) users[userI] = null;

或者,您也可以使用map:

重新分配整个数组。
var users = users.map(u => u.id===newUser.id ? null : u);