考虑相同值的键时将数组转换为对象

时间:2018-10-20 00:37:12

标签: javascript arrays object

我正在尝试找出一种将对象数组转换为对象的简单方法

我有一个看起来像这样的对象数组:

   [
      {
       "id": "-LP9_kAbqnsQwXq0oGDT",
       "value": Object {
         "date": 1541482236000,
         "title": "First",
       },
     },
    .... more objects here
   ]

id希望将其转换为以时间戳为键的对象,并转换为对应于该日期的对象数组。如果该键已经存在,则将该对象添加到与该键关联的对应数组中

 {
   1541482236000: 
     [{
           "id": "-LP9_kAbqnsQwXq0oGDT",
           "value": Object {
             "date": 1541482236000,
             "title": "First",
           },
         },
         {
           "id": "-LP9_kAbqnsQwXqZZZZ",
           "value": Object {
             "date": 1541482236000,
             "title": "Some other title",
           },
         },
        .... more objects here
     ],
  1541482236001: 
     [{
           "id": "-LP9_kAbqnsQ1234",
           "value": Object {
             "date": 1541482236001,
             "title": "Another title",
           },
         },

        .... more objects here
     ]
 }

使用reduce可以达到类似的目的。但是,当它们的键已经存在时,它不处理将对象添加到数组的操作。

calendarReminders = action.value.reduce((obj, reminder) => {
                dateKey = moment(reminder.value.date).format('YYYY-MM-DD')
                obj[dateKey] = [reminder]
                return obj;
            }, {});

我该怎么做?

2 个答案:

答案 0 :(得分:0)

请测试以下代码!

首先,您要遍历数据数组, 如果您的结果对象/词典已经有了该键,则只需添加当前项

否则,您将生成密钥并设置值

const data = [];

let result = {};

for (const item of data) {
  const key = item.value.date;
  if (result.hasOwnProperty(key)) {
    const prevData = result[key];
    result[key] = [...prevData, item];
  } else {
    result[key] = [item];
  }
}

答案 1 :(得分:0)

您只需要检查对象是否已经是键,如果没有,则将其与数组的值相加。然后,您可以push()放入其中:

let arr = [{"id": "-LP9_kAbqnsQwXq0oGDT","value":  {"date": 1541482236000,"title": "First",},},{"id": "SomID","value":  {"date": 1541482236000,"title": "Some other title",},},{"id": "A different ID","value":  {"date": 1541482236001,"title": "A third title",},}]

 let calendarReminders = arr.reduce((obj, reminder) => {
    (obj[reminder.value.date] || (obj[reminder.value.date] = [])).push(reminder)
    return obj;
}, {});
console.log(calendarReminders)

如果您想随时间将键设置为其他格式,则应该能够做到这一点而无需更改基本概念。

相关问题