【问题标题】:why filtering then mapping changes the original array in javascript [duplicate]为什么过滤然后映射会改变javascript中的原始数组[重复]
【发布时间】:2020-05-18 09:36:37
【问题描述】:
const words = [{ref : "a", list: "a & b & c & d", total: 0},
              {ref : "a", list: "a & b & c & d", total: 0},
              {ref : "b", list: "aa & bb & cc & dd", total: 0},
              {ref : "c", list: "aaa & bbb & ccc & ddd", total: 0}];

 var data = words.filter(item => {
            if (item.ref == "a")
              return item;
        });

let result = data.map(o => {
            o.list = o.list.split('&').map(key => ({
                selected: false,
            }))
            return o;
        });
console.log(words);
console.log(result);
  • 我有单词数组
  • 过滤ref : a 后,我得到了新数组data
  • 但是当我修改data 的对象时,它反映在主数组words 上。 这不应该发生。
words
> Array [
Object { ref: "a", list: Array [Object { selected: false }, Object { selected: false }] },
Object { ref: "a", list: Array [Object { selected: false }, Object { selected: false }] },
Object { ref: "b", list: "aa & bb" },
Object { ref: "c", list: "aaa & bbb" }
]

result
> Array [
Object { ref: "a", list: Array [Object { selected: false }, Object { selected: false }] },
Object { ref: "a", list: Array [Object { selected: false }, Object { selected: false }] }
]
  • 用字你可以看到ref bref c没有被修改
  • ref a 已更改。在我的情况下不应该发生这种情况

* 如何避免更改原始数组 words ? *

【问题讨论】:

  • map 返回一个新数组。但是,在这里o.list = o.list.split() 您正在修改数组中的对象。您可以将其更改为 data.map(o => ({ ...o, list:o.list.split('&') }) ) 之类的内容。此外,您可以将过滤器简化为:words.filter(item => item.ref == "a")

标签: javascript


【解决方案1】:

您的.map() 调用更改了原始对象的list 属性。 map() 返回一个新数组,但是如果你直接更改其中的对象,它们就会受到影响。对象总是通过引用传递。

为防止您的map() 更改原始数组,您需要返回每个元素的副本:

let result = data.map(o => ({
    ...o,
    points: 10,
    list: o.list.split('&').map(key => ({
        selected: false,
    }))
}));

注意,你也用错了filter()。在filter() 中,您应该分别返回truefalse 来保留或拒绝一个元素。返回您的条件结果就足够了:

var data = words.filter(item => {
    return item.ref == "a";
});

【讨论】:

  • 你没有回答我的问题How to avoid alteration of original array words ?
  • 这个return item.ref == "a"; 没有回答我的问题
  • 我确实回答了你的问题,请仔细阅读我的整个答案。
  • 好的,您多次修改了答案。我没有看到。谢谢
  • 我编辑了一次以添加 sn-p 如何修复您的map()。为什么它的行为从一开始就存在的答案。不过谢谢。
猜你喜欢
  • 2016-06-25
  • 2019-12-10
  • 1970-01-01
  • 2019-07-27
  • 2021-05-16
  • 2021-11-18
  • 1970-01-01
  • 2021-11-03
  • 2018-01-13
相关资源
最近更新 更多