JavaScript:如何在两个输入数组上对基于二维数组的匹配字段进行分组?

Bai*_*iao 0 javascript

我有以下数组ab如图所示?

var a = [
  {id: 1, name: "phone"},
  {id: 2,  name: "nick"}
];

var b = [
  {id: 7, parentId: 1, name: "phone_item1"},
  {id: 8, parentId: 2, name: "phone_item2"},
  {id: 9, parentId: 1, name: "nick_item1"},
  {id: 10, parentId: 2, name: "nick_item2"}
];

//You want to filter by A array id
const filterIds = a.map(({ id }) => id);

//My attempt
const c = Object.values(b.reduce((r, c) => {
  r[c.parentId] = r[c.parentId] || [];
  r[c.parentId].push(c);
  return r;
}, {}));

console.log(c)
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取以下二维数组:

[[
  {id: 7, parentId: 1, name: "phone_item1"},
  {id: 9, parentId: 1, name: "nick_item1"}
],[
  {id: 8, parentId: 2, name: "phone_item2"},
  {id: 10, parentId: 2, name: "nick_item2"}
]]
Run Code Online (Sandbox Code Playgroud)

生成的数组应该根据idarray aparentIdof 的比较b,这样才能得到2D数组的这种样式。由于某种原因,我的尝试无法正常工作-您可以帮我吗?

Dac*_*nny 5

如果我在这里遗漏了一些东西,不要担心-假设我正确理解了您的问题,一个简单的实现就是映射每一项,a以使映射返回bon匹配项之间的过滤后的子集bItem.parentId === aItem.id(其中aItembItem分别迭代各个列表的项) :

var a = [
  {id: 1, name: "phone"},
  {id: 2,  name: "nick"}
];

var b = [
  {id: 7, parentId: 1, name: "phone_item1"},
  {id: 8, parentId: 2, name: "phone_item2"},
  {id: 9, parentId: 1, name: "nick_item1"},
  {id: 10, parentId: 2, name: "nick_item2"}
];

/* Map each item in a to a classification of b against a */
const result = a.map(aItem => {

  /* For current aItem, return a subset of b, filtered by matches 
  on bItem.parentId === aItem.id (ie the classification criteria) */
  return b.filter(bItem => bItem.parentId === aItem.id)
});

console.log(result)
Run Code Online (Sandbox Code Playgroud)