从另外2个数组中创建一个数组

时间:2020-10-14 18:51:54

标签: javascript arrays object

我有两个对象数组,如下所示:

categories = [
  { name: "performance", id: 1 },
  { name: "understanding", id: 2 }
]
queries = [
  { name: "A", categoryId: "1" },
  { name: "B", categoryId: "1" },
  { name: "C", categoryId: "1" },
  { name: "D", categoryId: "2" }
]

现在,使用这两个对象数组,结果需要以下数组:

process = [
  { category: "performance", query: [
    { name: "A" },
    { name: "B" },
    { name: "C" }
  ]},
  { category: "understanding", query: [{ name: "D" }] }
]

我必须将categoryId与进程的ID匹配,然后创建上述数组。 我尝试了以下方法来解决此问题,但无法获得预期的结果。

const test = [];
categories.forEach((element) => {
  const r = que.filter((res) => res.categoryId === element.id);
  queries.forEach((rt) => {
    if (rt.categoryId === element.id) {
      test.push({
        category: element.name,
        query: [{
          name: rt.name,
        }],
      });
    }
  });
});

使用JavaScript中的任何内置数组方法是否有可能? 预先感谢

2 个答案:

答案 0 :(得分:0)

  • 使用Array.reduce,可以按queriescategoryId进行分组。
  • 基于该groupedBy对象,使用Array.map,可以获得所需的结果。

const categories = [{
  name: "performance",
  id: "1"
},{
  name: "understanding",
  id: "2"
}];

const queries = [{
  name: "A",
  categoryId: "1"
}, {
  name: "B",
  categoryId: "1"
}, {
  name: "C",
  categoryId: "1"
}, {
  name: "D",
  categoryId: "2"
}];
const groupByQueries = queries.reduce((acc, cur) => {
  acc[cur.categoryId] ?
    acc[cur.categoryId].push({ name: cur.name })
    : acc[cur.categoryId] = [ { name: cur.name } ];
  return acc;
}, {});

const result = categories.map(({ name, id }) => ({
  category: name,
  query: groupByQueries[id]
}));
console.log(result);

答案 1 :(得分:0)

categories = [{name: "performance", id: 1},{name: "understanding", id: 2}];
queries = [{name: "A", categoryId: "1"}, {name: "B", categoryId: "1"}, {name: "C", categoryId: "1"}, {name: "D", categoryId: "2"}]

const test = [];
categories.forEach((element) => {
        
        let temp = []
        queries.map(item =>{
        if(element.id.toString() === item.categoryId)
        temp.push({name: item.name})
        })
        test.push({category:element.name,query:temp})
        
});
console.log(test)