json 如果项目具有匹配值,则循环遍历Map并推送到新对象组[重复]

iibxawm4  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(104)
    • 此问题在此处已有答案**:

(32个答案)
2天前关闭。
我有以下最简单的数据结构:

items: [
   { id: 1, account: 'acct_101' },
   { id: 2, account: 'acct_52' },
   { id: 3, account: 'acct_33' },
   { id: 4, account: 'acct_101' },
   { id: 5, account: 'acct_101' },
]

我想根据帐户数据将项目分组。数据是动态的;我事先不知道帐号是什么。
我可以遍历数据:

items.map((item) => (
   console.log("item account: ", item.account)
))

但不确定如何匹配item.account是否已经存在,如果存在,则添加到现有数据对象,如果不存在,则创建新对象组。
所需的输出可能如下所示:

item_groups:  [
  { 
    acct_101: [
      { id: 1, account: 'acct_101' },
      { id: 4, account: 'acct_101' },
      { id: 5, account: 'acct_101' },
    ],
    acct_52: [
      { id: 2, account: 'acct_52' },
    ],
    acct_33: [
     { id: 2, account: 'acct_33' },
    ],
  }
]
z8dt9xmd

z8dt9xmd1#

尝试如下:

const items = [
   { id: 1, account: 'acct_101' },
   { id: 2, account: 'acct_52' },
   { id: 3, account: 'acct_33' },
   { id: 4, account: 'acct_101' },
   { id: 5, account: 'acct_101' },
]

const output = items.reduce((prev, curr) => {
  if(prev[curr.account]) {
    prev[curr.account].push(curr)
  } else {
    prev[curr.account] = [curr]
  }
  return prev
}, {})

console.log([output])

更简短的形式:

const items = [
   { id: 1, account: 'acct_101' },
   { id: 2, account: 'acct_52' },
   { id: 3, account: 'acct_33' },
   { id: 4, account: 'acct_101' },
   { id: 5, account: 'acct_101' },
]

const output = items.reduce((prev, curr) => {
  prev[curr.account] = (prev[curr.account] ?? []).concat(curr)
  return prev
}, {})

console.log([output])

使用Array.prototype.reduce()

1l5u6lss

1l5u6lss2#

对于你想要的输出,我认为你需要使用减少高阶函数。
因此,您的代码将是:

const itemGroups = items.reduce((acc, item) => {
  const account = item.account;
  if (acc[account]) {
    acc[account].push(item);
  } else {
    acc[account] = [item];
  }
  return acc;
}, {});

console.log(itemGroups);

输出:

{
  acct_101: [
    { id: 1, account: 'acct_101' },
    { id: 4, account: 'acct_101' },
    { id: 5, account: 'acct_101' }
  ],
  acct_52: [ { id: 2, account: 'acct_52' } ],
  acct_33: [ { id: 3, account: 'acct_33' } ]
}
nbnkbykc

nbnkbykc3#

const arr = [{
    id: 1,
    account: 'acct_101'
  },
  {
    id: 2,
    account: 'acct_52'
  },
  {
    id: 3,
    account: 'acct_33'
  },
  {
    id: 4,
    account: 'acct_101'
  },
  {
    id: 5,
    account: 'acct_101'
  },
];
const retObj = {};
for (let i = 0; i < arr.length; i++) {

  retObj[arr[i]["account"]] = arr.filter(item => item.account == arr[i]["account"]);
}
console.log(retObj)

相关问题