【问题标题】:Mapping over arrays in objects in arrays映射数组中对象中的数组
【发布时间】:2017-08-18 07:35:14
【问题描述】:

我有这样的数据结构:

let foo = [{ "a": [1,2,3] }]

我想映射对象内部的数组,在这个数组中

// Approach 1:
foo.map(foo => foo.a.map(val => val + 1))

这会返回[ [ 2,3,4 ] ],但会移除外部对象(我认为这很有趣)。

// Approach 2:
foo.map(foo => {
    foo.a = foo.a.map(val => val + 1)
    return foo
})

这可行,但也会改变对象本身。

有没有办法做到这一点,返回正确的值,但不改变作为参数给出的对象?

编辑:

我的用例包括在这个数组中有多个对象:

let bar = [
    { "a": [1,2,3] },
    { "a": [5,5,5] },
    { "a": [10,100,1000] },
]

所以直接寻址内部的数组并没有真正的帮助。

【问题讨论】:

  • foo[0].a.map(val => val + 1)

标签: javascript arrays mapping javascript-objects


【解决方案1】:

您可以使用Object.assign() 返回原始对象的副本并添加修改后的a 数组。

let bar = [
  { "a": [1,2,3]},
  { "a": [5,5,5] },
  { "a": [10,100,1000] },
]

let result = bar.map(function(e) {
  return Object.assign({}, e, {a: e.a.map(a => a + 1)})
})

console.log(bar)
console.log(result)

【讨论】:

    【解决方案2】:

    您可以迭代对象的所有条目并返回一个包含所有对象和递增数组的新数组。

    let foo = [{ a: [1, 2, 3] }, { b: [7, 8, 9] }],
        result = foo.map(o => Object.assign({}, ...Object.entries(o).map(([k, v]) => ({ [k]: v.map(b => b + 1) }))));
    
    console.log(result);
    console.log(foo);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      我建议您在使用Object.assign() 时要小心,因为如果它的第一个参数是空对象,它将破坏对foo 中对象的引用。根据具体情况,这可能是您想要的,也可能不是您想要的。

      如果您想保留引用,您可以简单地执行以下操作;

      var foo = [{ "a": [1,2,3]}],
          bar = foo.map(o => (o.a = o.a.map(val => val + 1),o));
      
      console.log(bar);
      foo[0].x = "whatever";
      console.log(foo);
      console.log(bar);

      【讨论】:

      • “打破引用”是指复制数据结构?在这种情况下,我想将对象更多地视为数据结构而不是对象,所以我可以接受。
      • 还有,我不知道,你可以这样写箭头函数,太棒了!
      • @hgiesel 抱歉,我已经通过我的回答中提到的Object.assign() 的措辞进行了更正。
      猜你喜欢
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 2022-08-10
      • 2021-04-18
      相关资源
      最近更新 更多