【发布时间】:2019-05-01 04:40:15
【问题描述】:
简单我的意思是数组中的对象只包含原语。根据规范:
... filter 为数组中的每个元素调用一次 callbackfn,按升序排列,并构造一个新数组,其中包含 callbackfn 返回 true 的所有值。 ...
那么为什么在这个例子中我基本上得到了指向初始数组而不是新数组的链接???
console.clear();
const array = [
{id: 1, parent: 0},
{id: 2, parent: 1},
{id: 3, parent: 1},
{id: 4, parent: 1}
];
const newArray = array.filter(el => el.id === 2 && {...el});
const newArray2 = array.map(el => ({...el}));
newArray[0].children = 3; // mutation of initial array
const newEl = {...array[2]};
console.log('Array: ', array);
console.log('newArray2: ', newArray2);
console.log('array[1] === newArray[0]: ', array[1] === newArray[0]); // WTF???
console.log('array[1] === newArray2[1]: ', array[1] === newArray2[1]);
console.log('newEl === array[2]: ', newEl === array[2]);
【问题讨论】:
-
在
newArray[0].children = 3;中,您正在改变一个object,它同时in 新数组和原始数组。看来您没有正确使用filter。过滤器行中的{...el}在这里没有任何作用。要观察array和newArray是单独的数组,您需要做的就是观察array === newArray的值(这是错误的)。 -
是的,
filter不适用于深度复制对象。
标签: javascript arrays