使用JavaScript中的map将值添加到内部数组

3
假设我有以下数组:
let array = [
  {
    id: "1",
    name: "name",
    categories: [
      {
        subid: "10",
        name: "name",
      },
      {
        subid: "11",
        name: "name",
      }
    ]
  },
  {
    id: "2",
    name: "name",
    categories: [
      {
        subid: "20",
        name: "name",
      },
      {
        subid: "21",
        name: "name",
      }
    ]
  }
]

我的目标是获取每个对象的id并将其添加到内部数组categories中。因此,它应该看起来像这样:
let array = [
  {
    id: "1",
    name: "name",
    categories: [
      {
        subid: "10",
        name: "name",
        id: "1"
      },
      {
        subid: "11",
        name: "name",
        id: "1"
      }
    ]
  },
  {
    id: "2",
    name: "name",
    categories: [
      {
        subid: "20",
        name: "name",
        id: "2"
      },
      {
        subid: "21",
        name: "name",
        id: "2"
      }
    ]
  }
]

目前我已经有了这些:

array.map(x => (x.id)) // returns new array of ids
// add these into the categories

我可以如何使用map来实现这个?如果不能用map,我觉得for each也可以工作。


你想改变原始数据还是获得独立的新对象? - Nina Scholz
我想从原始数据中获取一个新的数组。 - cup_of
5个回答

2
使用map方法和对象内的展开语法,您可以做到这一点。

let array = [{"id":"1","name":"name","categories":[{"subid":"10","name":"name"},{"subid":"11","name":"name"}]},{"id":"2","name":"name","categories":[{"subid":"20","name":"name"},{"subid":"21","name":"name"}]}]

let result = array.map(({id, categories, ...rest}) => ({
  ...rest, id, categories: categories.map((o) => ({...o, id}))
}))

console.log(result)


2
您可以使用Array.forEach()来遍历数组,然后在类别数组上使用Array.map()将id属性添加到所有对象中:

let array = [ { id: "1", name: "name", categories: [ { subid: "10", name: "name", }, { subid: "11", name: "name", } ] }, { id: "2", name: "name", categories: [ { subid: "20", name: "name", }, { subid: "21", name: "name", } ] } ];
array.forEach((o)=>{
  o.categories = o.categories.map(cat=>Object.assign({},cat,{id : o.id}));
});
console.log(array);


这是一种比另一个(Nenad的)答案更清晰的方法。但是,OP刚刚评论说他想从数据中得到一个新对象。也许你可以相应地进行调整。 - KarelG
@KarelG 谢谢 :-) - amrender singh

2
嵌套映射怎么办?

let arr = [
  {
    id: "1",
    name: "name",
    categories: [
      {
        subid: "10",
        name: "name",
      },
      {
        subid: "11",
        name: "name",
      }
    ]
  },
  {
    id: "2",
    name: "name",
    categories: [
      {
        subid: "20",
        name: "name",
      },
      {
        subid: "21",
        name: "name",
      }
    ]
  }
]

arr.map(x=>{
    x.categories.map(y => { 
        y.id = x.id
    })
})

console.log(arr)


这将修改原始数组。 - Roko C. Buljan

1
你需要映射所有复制属性的数组,以获取具有新属性的新独立数据。

let array = [{ id: "1", name: "name", categories: [{ subid: "10", name: "name", }, { subid: "11", name: "name", }] }, { id: "2", name: "name", categories: [{ subid: "20", name: "name", }, { subid: "21", name: "name", }] }],
    updated = array.map(o => Object.assign(
        {},
        o,
        { categories: o.categories.map(p => Object.assign({}, p, { id: o.id })) }
    ));

console.log(updated);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }


是的!这正是我正在寻找的。非常感谢。 - cup_of

1
使用Jquery的each函数即可完成任务。 $.each(array,function(index,item){item.categories.id = item.id;}); 谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接