[英]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.