[英]how to create unique array of object in deep nested array of object?
所以我有一個數組,其中一個鍵有另一個數組 object 我需要使用 lodash 或 vanila JavaScript 從這個數組基於兩個鍵級別和userId制作唯一的 object 數組
例如
const data = [
{
values: {
output: [],
}
},
{
values: {
output: [
{ level: 1, userId: "810", },
{ level: 1, userId: "811", },
{ level: 2, userId: "811", },
],
},
},
{
values: {
output: [
{ level: 1, userId: "810", },
],
}
},
{
values: {
output: [
{ level: 1, userId: "810", },
{ level: 3, userId: "810", },
],
}
},
{
values: {
output: [
{ level: 1, userId: "810", },
{ level: 3, userId: "810", },
],
}
}
];
預計 output 是
let output =[
{ level: 1, userId: "810", },
{ level: 1, userId: "811", },
{ level: 2, userId: "811", },
{ level: 3, userId: "810", },
]
使用_.flatMap()
(或Array.flatMap()
獲取所有output
屬性的數組,然后使用_.uniqBy()
僅獲取唯一項。在_.uniqBy()
回調中通過組合level
返回自定義值和userId
到單個字符串。
ES5:
var data = [{"values":{"output":[]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":1,"userId":"811"},{"level":2,"userId":"811"}]}},{"values":{"output":[{"level":1,"userId":"810"}]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":3,"userId":"810"}]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":3,"userId":"810"}]}}]; var result = _.uniqBy( _.flatMap(data, function(o) { return o.values.output; }), function(o) { return o.level + '-' + o.userId; } ); console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
ES6:
const data = [{"values":{"output":[]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":1,"userId":"811"},{"level":2,"userId":"811"}]}},{"values":{"output":[{"level":1,"userId":"810"}]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":3,"userId":"810"}]}},{"values":{"output":[{"level":1,"userId":"810"},{"level":3,"userId":"810"}]}}]; const result = _.uniqBy( _.flatMap(data, o => o.values.output), o => `${o.level}-${o.userId}` ); console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
這是一個非常普通的 JS 解決方案。 這在龐大的數據集上不會很快,但對於像您的示例這樣的數據集,還算不錯。 它首先將您的所有數據收集到一個數組中,然后構建一個新的無重復數組。 如果您需要小心覆蓋傳入的數據,那么您可以先克隆它。
function mergeAllData(data) {
var allData = [];
for (var i in data) {
allData = allData.concat(data[i].values.output);
}
return allData;
}
function filterDuplicates(allData) {
var ret = [];
for (var i in allData) {
var current = allData[i];
ret.push(current);
for (var j in allData) {
if (isADuplicate(current, allData[i])) {
allData.splice(j, 1);
}
}
}
return ret;
}
function isADuplicate(t1, t2) {
return t1.level === t2.level && t1.userId === t2.userId;
}
console.log(filterDuplicates(mergeAllData()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.