[英]Node.js split JSON Object Per a Value
我有一個需要拆分 JSON 對象的 Node 10+ 腳本。 我一直在尋找各種解決方案,但沒有一個適合我的特定需求。 這是我的對象:
[
[
{agent_id: '123', start: '10-05-2018'},
{ agent_id: '123', start: '10-05-2018'}
],
[
{ agent_id: '456', start: '10-04-2018'},
{ agent_id: '456', start: '10-05-2018'}
]
]
所以有兩個元素/節點; 一個的agent_id
為“123”,另一個為“456”。 但是需要發生的是,如果元素中的start
相同,則無需拆分,就像agent_id
為 '123' 的情況一樣。 但在start
不同的情況下,需要拆分。 因此,上述對象的最終結果應該如下所示。 如您所見,結果包含三個元素。 我查看了“地圖”或“設置”或其他示例,但沒有一個適用於我的情況。 因此我在這里。
謝謝!
[
[
{ agent_id: '123', start: '10-05-2018'},
{ agent_id: '123', start: '10-05-2018'}
],
[ { agent_id: '456', start: '10-04-2018'}],
[ { agent_id: '456', start: '10-05-2018'}]
]
如果你沒有使用 lodash,你可以在 vanilla JS 中嘗試以下代碼:
let input = [
[
{ agent_id: '123', start: '10-05-2018' },
{ agent_id: '123', start: '10-05-2018' }
],
[
{ agent_id: '456', start: '10-04-2018' },
{ agent_id: '456', start: '10-05-2018' }
]
];
function recursiveFunc(arrItem, resultingArr) {
if (Array.isArray(arrItem) && arrItem.length) {
let matchArr = []; let restArr = [];
arrItem.every((v) => {
if (!(v.start === arrItem[0].start)) {
restArr.push(v);
} else {
matchArr.push(v);
}
return v.start === arrItem[0].start;
});
if (matchArr.length) resultingArr.push(matchArr);
if (restArr.length > 1) {
return recursiveFunc(restArr, resultingArr);
} else {
if (restArr.length) resultingArr.push(restArr);
}
}
}
let resultingArr = [];
input.forEach(arrItem => {
recursiveFunc(arrItem, resultingArr);
});
console.log(resultingArr);
使用lodash
包中的groupBy
方法:
const _ = require('lodash')
const items = [
[
{agent_id: '123', start: '10-05-2018'},
{ agent_id: '123', start: '10-05-2018'}
],
[
{ agent_id: '456', start: '10-04-2018'},
{ agent_id: '456', start: '10-05-2018'}
]
]
const result = items
.map(x => Object.values(_.groupBy(x, el => `${el.agent_id}:${el.start}`)))
.reduce((curr, next) => curr.concat(next), [])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.