簡體   English   中英

Node.js 按值拆分 JSON 對象

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM