Javascript 数组过滤器更改主数组

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

我注意到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 !== "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);