首页 > 解决方案 > 如何根据键对数组进行分组并创建以分组数组为值的动态对象?

问题描述

我有多个items,其中一些相同title。我想创建一个多维数组,其中title第一个键和一个唯一编号作为第二个键。因此可以按items分类title

例子:

itemArray['title1'][0] = item1

itemArray['title1'][1] = item2

itemArray['title2'][0] = item3

我的示例正在使用此代码,但在我看来它很复杂,我希望 JavaScript 有另一种方法。

let itemArray = {}
items.forEach(item => {
    let title = item['title']

    if (itemArray[title] == null) {
      itemArray[title] = {}
    }
    let index = Object.keys(itemArray[title]).length
    itemArray[title][index] = item
  },
)

输入:

[ RowDataPacket {
    uid: 1,
    title: 'booktitle',
    description: 'description' },
  RowDataPacket {
    uid: 2,
    title: 'booktitle',
    description: 'description 2' },
  RowDataPacket {
    uid: 1,
    title: 'booktitle 2',
    description: 'description' } ]

预期输出(因为它是 sql 查询的结果,所以项目是 RowDataPacket):

{ 'booktitle':
    { '0':
      RowDataPacket {
        uid: 1,
        title: 'booktitle',
        description: 'description'  } },
    { '1':
      RowDataPacket {
        uid: 2,
        title: 'booktitle',
        description: 'description 2'  } },
  'booktitle 2':
    { '0':
      RowDataPacket {
        uid: 1,
        title: 'booktitle 2',
        description: 'description'  } }
}

使用 PHP 很容易,它的工作方式如下:

$itemArray = array();
foreach ($items as $key => $item) {
    $itemArray[$item['title']][] = $item;
}

提前致谢!

标签: javascriptarraysmultidimensional-array

解决方案


你有正确的想法。您创建的itemArray不是多维数组。它是一个对象,每个对象都title作为键,而数组的值与它们的值items相同title。你可能会forEach像这样简化你的:

var items = [{
  uid: 1,
  title: 'booktitle',
  description: 'description'
}, {
  uid: 2,
  title: 'booktitle',
  description: 'description 2'
}, {
  uid: 1,
  title: 'booktitle 2',
  description: 'description'
}]

let itemArray = {}
items.forEach(item => {
  itemArray[item.title] = itemArray[item.title] || [];
  itemArray[item.title].push(item)
})

console.log(itemArray)

检查是否itemArray已经有titleas 键。如果是,请使用它。否则,将其指向一个空数组[]。然后只是该属性push的电流。item

使用reduce,您甚至可以将其简化为:

var items=[{uid:1,title:'booktitle',description:'description'},{uid:2,title:'booktitle',description:'description 2'},{uid:1,title:'booktitle 2',description:'description'}]

let itemArray = items.reduce((acc,i) => 
  ((acc[i.title] = acc[i.title] || []).push(i), acc)
,{})

console.log(itemArray)


推荐阅读