簡體   English   中英

如何在 object 的深層嵌套數組中創建唯一的 object 數組?

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

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