javascript – 数组过滤器更改主数组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 数组过滤器更改主数组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4176字,纯文字阅读大概需要6分钟。
内容图文
![javascript – 数组过滤器更改主数组](/upload/InfoBanner/zyjiaocheng/746/f2f3522f12b44647bfc0e0d610098474.jpg)
我注意到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
从理论上讲,阵列数组不应该改变,因为我没有以任何方式操纵它. Hovewer,这是我在控制台中获得的:
[ { name: 'bob', planet: 'earth' },
{ name: 'mike', planet: 'mars' },
{ name: 'vlad', planet: 'jupiter' } ] //this array is normal
---
[ { name: 'bob', planet: 'earth' },
{ name: 'vlad', planet: 'jupiter' } ] //this is good behavior, since I don't need "mike"
After replacement:
[ { name: 'bob[NEW]' },
{ name: 'mike', planet: 'mars' },
{ name: 'vlad[NEW]' } ] //this should not be changed in any way
-----------
[ { name: 'bob[NEW]' }, { name: 'vlad[NEW]' } ] //this is correct
为什么会这样?我需要数组保持与开始时相同.
谢谢.
解决方法:
你的代码在这里:
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
}
……没有改变任何一个阵列.它正在改变两个数组引用的对象的状态.
更简单的例子:
var a = [{answer:null}];
var b = a.filter(function() { return true; }); // Just a copy, but using `filter` for emphasis
a[0].answer = 42;
console.log(b[0].answer); // 42
这一行:
a[0].answer = 42;
不改变a或b,它改变[0]所指的状态,b [0]也指.
让我们抛出一些ASCII艺术的Unicode艺术:
在此之后:
var a = [{answer:null}];
这就是我们在记忆中所拥有的(忽略一些不相关的细节);
+??????????????+ | variable "a" | +??????????????+ +??????????????+ | Ref11542 |????>| array | +??????????????+ +??????????????+ +??????????????+ | 0: Ref88464 |????>| object | +??????????????+ +??????????????+ | answer: null | +??????????????+
a引用一个数组对象,它具有0属性,该属性引用具有answer属性的对象.我使用“Ref11542”和“Ref88494”来表示a和a [0]包含的对象引用,但当然我们从未真正看到这些引用的值;它们是JavaScript引擎的私有内容.
然后我们这样做:
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 |??+ +??????????????+
请注意,两个数组都包含相同的对象引用(此处显示为“Ref88464”);他们指向同一个对象.
现在我们这样做:
a[0].answer = 42;
所做的只是改变对象的状态;它对a或b或它们引用的数组没有影响:
+??????????????+ | variable "a" | +??????????????+ +??????????????+ | Ref11542 |????>| array | +??????????????+ +??????????????+ | 0: Ref88464 |??+ +??????????????+ | | | +??????????????+ +??????????????+ +?>| object | | variable "b" | | +??????????????+ +??????????????+ +??????????????+ | | answer: 42 | | Ref66854 |????>| array | | +??????????????+ +??????????????+ +??????????????+ | ^ | 0: Ref88464 |??+ +??????? only change is here +??????????????+
很自然
console.log(b[0].answer);
……输出42.
在评论中你问过:
But then how do I set the state of filtered object and not the main one?
请记住,两个数组中的对象都是相同的.你还没有复制过这些对象,你刚刚创建了一个只包含其中一些的新数组.
如果希望能够在不影响第一个数组中的对象的情况下更改这些对象的属性,则需要复制对象.
如果对象只包含简单的原始值,那很容易;一般情况很难.
内容总结
以上是互联网集市为您收集整理的javascript – 数组过滤器更改主数组全部内容,希望文章能够帮你解决javascript – 数组过滤器更改主数组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。