如何基于打字稿中的特定键将数据推送到同一对象

问题描述

我有如下所示的jason结果,我想从中读取并按如下所示推至特定键 JSON结果

[
{id:1,Name:"test",billNumber:"123"}
{id:2,Name:"test1",billNumber:"123"}
{id:3,Name:"test2",billNumber:"12345"}
{id:2,Name:"test3",billNumber:"12345"}
{id:3,Name:"test4",billNumber:"12334535"}
]

我想拥有如下数组列表

{
"123":[{id:1,billNumber:"123"},{id:2,billNumber:"123"}],"12345":[ {id:3,billNumber:"12345"},billNumber:"12345"}],"12334535":[{id:3,billNumber:"12334535"}]
}

如何从json结果中获取上述列表。请帮忙

解决方法

您不需要lodash来做到这一点:只需执行常规的Array.prototype.reduce就可以了。在每次迭代中,您只需检查当前项目的billNumber是否在对象中:

  • 如果不是(即新条目),则为数组分配单个元素
  • 如果是(例如,以前遇到过billNumber),那么您只需将其推入数组

请参见下面的概念验证:

const data = [{
  id: 1,Name: "test",billNumber: "123"
},{
  id: 2,Name: "test1",{
  id: 3,Name: "test2",billNumber: "12345"
},Name: "test3",Name: "test4",billNumber: "12334535"
}];

const transformedData = data.reduce((acc,cur) => {
  if (cur.billNumber in acc) {
    acc[cur.billNumber].push(cur);
  } else {
    acc[cur.billNumber] = [cur];
  }

  return acc;
},{});
console.log(transformedData);

,

使用groupBy中的lodashconst result = groupBy(input,"billNumber")input是您的数组)

,

您可以使用reduce方法。

[
{id:1,Name:"test",billNumber:"123"},{id:2,Name:"test1",{id:3,Name:"test2",billNumber:"12345"},Name:"test3",Name:"test4",billNumber:"12334535"},].reduce((acc,value) => {
    if (!acc[value.billNumber]) {
        acc[value.billNumber] = [];
    }
    
    acc[value.billNumber].push(value);
    return acc;
},{})
,

这是您无法使用并获得帮助的模拟代码

var a = [{a:2},{a:3},{a:4}]

let b = {}
let c = 1
a.forEach(obj => {
  b[c] = [obj]
  c++
})

输出将为

{ 
  1: [ { a: 2 } ],2: [ { a: 3 } ],3: [ { a: 4 } ] 
}

谢谢,希望对您有所帮助!