Javascript 数组过滤器更改主数组
我注意到node.js上的数组过滤器中有一些奇怪的行为。 有一个简单的数组和一个循环:Javascript 数组过滤器更改主数组,javascript,arrays,node.js,Javascript,Arrays,Node.js,我注意到node.js上的数组过滤器中有一些奇怪的行为。 有一个简单的数组和一个循环: var array = [ { name:"bob", planet:"earth" }, { name:"mike", planet:"mars" }, { name:"vlad", planet:"jupiter" }]; var filtered = array.filter(function(x){ return x.name !== "mik
var array = [
{
name:"bob",
planet:"earth"
},
{
name:"mike",
planet:"mars"
},
{
name:"vlad",
planet:"jupiter"
}];
var filtered = array.filter(function(x){
return x.name !== "mike";
});
console.log(array); //lets print how normal array looks like
console.log("---");
console.log(filtered); //lets print how filtered one looks like
for(var i = 0; i < filtered.length; i++)
{
delete filtered[i].planet; //remove planet
filtered[i].name = filtered[i].name + "[NEW]"; //add NEW to the name
}
console.log("After replacement:");
console.log(array);//lets print how normal array looks like now
console.log("-----------");
console.log(filtered);//lets print how filtered array looks like now
为什么会发生这种情况?我需要array
与开始时保持一致
谢谢。您的代码在这里:
for(var i = 0; i < filtered.length; i++)
{
delete filtered[i].planet; //remove planet
filtered[i].name = filtered[i].name + "[NEW]"; //add NEW to the name
}
这一行:
a[0].answer = 42;
不会更改a
或b
,它会更改a[0]
引用的内容的状态,而b[0]
也会引用该内容
让我们来看看ASCII艺术Unicode艺术:
在这一行之后:
var a = [{answer:null}];
这就是我们的记忆(忽略一些不相关的细节)
现在我们有:
+−−−−−−−−−−−−−−+
| variable "a" |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| Ref11542 |−−−−>| array |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| 0: Ref88464 |−−+
+−−−−−−−−−−−−−−+ |
|
| +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−>| object |
| variable "b" | | +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ | | answer: null |
| Ref66854 |−−−−>| array | | +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ |
| 0: Ref88464 |−−+
+−−−−−−−−−−−−−−+
所做的只是改变对象的状态;它对a
或b
或它们所指的数组没有影响:
+−−−−−−−−−−−−−−+
| variable "a" |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| Ref11542 |−−−−>| array |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| 0: Ref88464 |−−+
+−−−−−−−−−−−−−−+ |
|
| +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−>| object |
| variable "b" | | +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ | | answer: 42 |
| Ref66854 |−−−−>| array | | +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ | ^
| 0: Ref88464 |−−+ +−−−−−−− only change is here
+−−−−−−−−−−−−−−+
…产出42
在您询问的评论中:
但是如何设置过滤对象的状态而不是主对象的状态呢 请记住,两个数组中的对象是相同的。您没有复制对象,只是创建了一个新的数组,其中只有部分对象 如果希望能够在不影响第一个数组中的对象的情况下更改这些对象的属性,则需要制作对象的副本 如果对象只包含简单的基本值,这很容易;一般情况下是相当困难的。:-) 但是,在您的情况下,由于您的对象只有
名称
和行星
属性,接下来您要做的就是删除行星
属性并更改名称,因此我们可以很容易地创建对象;见评论:
var数组=[
{
姓名:“鲍勃”,
行星:“地球”
},
{
姓名:“迈克”,
行星:“火星”
},
{
姓名:“弗拉德”,
行星:“木星”
}];
var filtered=array.filter(函数(x){
返回x.name!=“mike”;
}).map(函数(x){
//创建一个*新*对象,将其'name'设置为'name'`
//对原始对象加上[新建],并忽略其
//“行星”财产
返回{name:x.name+“[NEW]”};
});
console.log(数组);
console.log(“--”);
console.log(过滤)
这是一个常见的JS范例,google可变JS对象
看起来你已经准备好了,如果你不想改变两个数组中引用的对象,那么如何设置过滤对象而不是主对象的状态?将其复制到一个变量,然后分配给[0]谢谢你用这样一个直截了当、易懂的回答来回答。@Nedas:我在回答的末尾加了一条注释。关键是复制对象,使它们不再共享。
+−−−−−−−−−−−−−−+
| variable "a" |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| Ref11542 |−−−−>| array |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| 0: Ref88464 |−−−−>| object |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| answer: null |
+−−−−−−−−−−−−−−+
var b = a.filter(function() { return true; }); // Just a copy, but using `filter` for emphasis
+−−−−−−−−−−−−−−+
| variable "a" |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| Ref11542 |−−−−>| array |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| 0: Ref88464 |−−+
+−−−−−−−−−−−−−−+ |
|
| +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−>| object |
| variable "b" | | +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ | | answer: null |
| Ref66854 |−−−−>| array | | +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ |
| 0: Ref88464 |−−+
+−−−−−−−−−−−−−−+
a[0].answer = 42;
+−−−−−−−−−−−−−−+
| variable "a" |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| Ref11542 |−−−−>| array |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+
| 0: Ref88464 |−−+
+−−−−−−−−−−−−−−+ |
|
| +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−>| object |
| variable "b" | | +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ | | answer: 42 |
| Ref66854 |−−−−>| array | | +−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−+ | ^
| 0: Ref88464 |−−+ +−−−−−−− only change is here
+−−−−−−−−−−−−−−+
console.log(b[0].answer);