简体   繁体   English

javascript:合并具有相同主密钥的对象

[英]javascript: merge objects with the same master key

How do I merge objects with the same key, say:如何合并具有相同键的对象,例如:

{id: 222, date: 'apr 1', todo: 'nothing' },
{id: 222, date: 'apr 2', todo: '' },
{id: 222, date: 'apr 3', todo: 'swim' },
{id: 222, date: 'apr 4', todo: 'run' },
{id: 222, date: 'apr 1', todo : ''},
{id: 222, date: 'apr 2', todo : 'jump'},
{id: 222, date: 'apr 3', todo : ''},
{id: 222, date: 'apr 4', todo : ''}

the result should be结果应该是

{id: 222,
date1: 'apr 1', todo1: 'nothing', 
date2: 'apr 2', todo2: 'jump',
date3: 'apr 3', todo3: 'swim',
date4: 'apr 4', todo4: 'run'
}

I managed to merge it somehow, but instead, i got this result....我设法以某种方式合并它,但相反,我得到了这个结果......

{id:222, date1: 'apr 1', todo1: 'nothing',
date2: 'apr 2', todo2: '',
date3: 'apr 3', todo3: 'swim',
date4: 'apr 4', todo4: 'run',
date5: 'apr 1', todo5: '',
date6: 'apr 2', todo6: 'jump'
date7: 'apr 3', todo7: '',
date8: 'apr 4', todo8: ''
}

Here's my code:这是我的代码:

var result = Object.values(temp.reduce((r, { id, date, todo }) => {
if (r[id]){
    r[id].payload['date' + r[id].index] = date;
    r[id].payload['todo' + r[id].index] = todo;
    r[id].index++;
} 
else r[id] = { index: 2, payload: { id, date, todo } };
   return r;
}, {}))
.map(({ payload }) => payload);

Try to use reduce method to group by date property:尝试使用reduce方法按date属性分组:

 let arr = [ { id: 222, date: 'apr 1', todo: 'nothing' }, { id: 222, date: 'apr 2', todo: '' }, { id: 222, date: 'apr 3', todo: 'swim' }, { id: 222, date: 'apr 4', todo: 'run' }, { id: 222, date: 'apr 1', todo: '' }, { id: 222, date: 'apr 2', todo: 'jump' }, { id: 222, date: 'apr 3', todo: '' }, { id: 222, date: 'apr 4', todo: '' } ]; const result = arr.reduce((a, { id, date, todo}) => { a[date] = a[date] || { id, date, todo}; if (a[date].todo.length === 0 ) a[date].todo = todo; return a; }, {}) console.log(Object.values(result));

or you can store all todo in array:或者您可以将所有todo存储在数组中:

const result = arr.reduce((a, { id, date, todo}) => {
    a[date] = a[date] || { id, date, todo:[]};
    a[date].todo.push(todo);
    return a;
}, {})

UPDATE:更新:

Updated output:更新 output:

 let arr = [ { id: 222, date: 'apr 1', todo: 'nothing' }, { id: 222, date: 'apr 2', todo: '' }, { id: 222, date: 'apr 3', todo: 'swim' }, { id: 222, date: 'apr 4', todo: 'run' }, { id: 222, date: 'apr 1', todo: '' }, { id: 222, date: 'apr 2', todo: 'jump' }, { id: 222, date: 'apr 3', todo: '' }, { id: 222, date: 'apr 4', todo: '' } ]; const result = arr.reduce((a, { id, date, todo}) => { a[id] = a[id] || { id }; let key = date.split(' ').pop(); a[id]['date' + key] = date; a[id]['todo' + key] = (todo.length > 0)? todo: a[id]['todo' + key]; return a; }, {}) console.log(Object.values(result));

UPDATE 1:更新 1:

 let arr = [ { id: 222, date: 'apr 1', todo: 'nothing' }, { id: 222, date: 'apr 2', todo: '' }, { id: 222, date: 'apr 3', todo: 'swim' }, { id: 222, date: 'apr 4', todo: 'run' }, { id: 222, date: 'apr 1', todo: '' }, { id: 222, date: 'apr 2', todo: 'jump' }, { id: 222, date: 'apr 3', todo: '' }, { id: 222, date: 'apr 4', todo: '' } ]; const groupedById = Object.values(arr.reduce((a, { id, date, todo}) => { a[id] = a[id] || { id }; a[id][date] = a[id][date] || {date}; if (todo.length > 0 &&;a[id][date]['todo']) a[id][date]['todo'] = todo; return a, }; {})). const result = groupedById,reduce((a, {id. ..;rest})=> { let count = 0; for (const key in rest) { count++. a['date' + count] =rest[key];date. a['todo' + count] =rest[key];todo; } a[id] = id; return a, }. {}) console;log(result);

You could take an object for grouping and store the postfix number for each new date/todo pair.您可以使用 object 进行分组并存储每个新日期/待办事项对的后缀编号。

At result take the values/payload from the objects.结果从对象中获取值/有效负载。

 var data = [{id: 222, date: 'apr 1', todo: 'nothing' }, { id: 222, date: 'apr 2', todo: '' }, { id: 222, date: 'apr 3', todo: 'swim' }, { id: 222, date: 'apr 4', todo: 'run' }, { id: 222, date: 'apr 1', todo: '' }, { id: 222, date: 'apr 2', todo: 'jump' }, { id: 222, date: 'apr 3', todo: '' }, { id: 222, date: 'apr 4', todo: '' }], result = Object.values(data.reduce((r, { id, date, todo }) => { if (:r[id]) r[id] = { index, 0: key, {}: payload; { id } }. if (.r[id];key[date]) { r[id].index++. r[id];key[date] = `todo${r[id].index}`. r[id];payload[`date${r[id].index}`] = date. } if (todo) r[id];payload[r[id];key[date]] = todo, return r. }; {})).map(({ payload }) => payload); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

This can be achieved with sort() , filter() , and reduce() :这可以通过sort()filter()reduce()来实现:

 let arr=[{id:222,date:"apr 1",todo:"nothing"},{id:222,date:"apr 2",todo:""},{id:222,date:"apr 3",todo:"swim"},{id:222,date:"apr 4",todo:"run"},{id:222,date:"apr 1",todo:""},{id:222,date:"apr 2",todo:"jump"},{id:222,date:"apr 3",todo:""},{id:222,date:"apr 4",todo:""}]; let res = arr.sort((a, b) => { return (a.date > b.date)? 1: -1 }).filter(el => { return el.todo }).reduce((acc,el,idx) => {.("id" in acc) && (acc.id = 222) return el?id === 222. Object,assign(acc: {["date" + (idx+1)]. el,date: ["todo" + (idx+1)]. el:todo}), acc }.{}) console.log(res)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM