繁体   English   中英

展平对象数组并返回唯一数组

[英]flattening, the array of objects and returning the unique array

我有一个看起来像这样的数组。

var arr = [{
    "taxname": "MFM",
    "member": [{
      "id": 1334,
      "name": "Mary G. King",
    }, {
      "id": 1324,
      "name": "Bonnie A. Wilson",
    }, {
      "id": 1336,
      "name": "Samantha B. Sellers",
    }]
  },
  {
    "taxname": "Test purpose",
    "member": [{
      "id": 1336,
      "name": "Samantha B. Sellers",
    }]
  },
  {
    "taxname": "New_Test_MF",
    "member": [{
      "id": 1334,
      "name": "Mary G. King",
    }]
  }
];

我已经把它弄平了,所以它只是一个对象数组。

const result = arr.reduce((r, obj) => r.concat(obj.member), []);

结果:

[{
  id: 1334,
  name: "Mary G. King"
}, {
  id: 1324,
  name: "Bonnie A. Wilson"
}, {
  id: 1336,
  name: "Samantha B. Sellers"
}, {
  id: 1336,
  name: "Samantha B. Sellers"
}, {
  id: 1334,
  name: "Mary G. King"
}]

之后,我从结果中删除了带有 id 的重复项。

const ids = result.map(o => o.id)
const filtered = result.filter(({id}, index) => !ids.includes(id, index + 1))

记录结果:

console.log(filtered);

[{
  id: 1324,
  name: "Bonnie A. Wilson"
}, {
  id: 1336,
  name: "Samantha B. Sellers"
}, {
  id: 1334,
  name: "Mary G. King"
}]

我得到了我想要的结果。 但是展平对象数组并返回唯一数组而不是使用多个查询的最佳方法是什么?

我认为你这样做的方式还不错,而且它是非常可读的代码,有时它不是关于编写最高性能的代码,而是关于编写可读、易于维护和可扩展的代码!

也就是说,这里有一些其他的选择:

  1. 您可以结合您的步骤,同时减少使用 map 将 ID 存储为键以便更快地查找(与检查 ID 数组相比)。
const existingIds = {};
const result = arr.reduce((r, obj) => r.concat(obj.member.filter((m) => {
  if (existingIds.hasOwnProperty(m.id.toString())) {
    return false;
  }

  existingIds[m.id] = true;
  return true;
})), []);
  1. 使用集合的力量(无重复元素)!

作为对代码的轻微修改,您可以使用 Set 来存储非重复 ID。 这样在你的最后一步,你不必做一个包含,而是一个查找,尽管你在这里交易不多。

const array2 = arr.reduce((r, obj) => r.concat(obj.member), []);
const nonDuplicateIds = Array.from(new Set(array2.map(m => m.id)))
const result2 = nonDuplicateIds.map(id => array2.find(member => member.id === id)) // You could also use an object for faster lookup
  1. 可能是我最喜欢的:使用对象使您的代码更加简单并且不需要任何映射/过滤!
const members = {};
arr.forEach(data => data.member.forEach((member) => members[member.id] = member));
const result3 = Object.values(members);
  1. 编辑:一种快速、低效的单行代码,您可以在减少的同时检查重复元素!
const result4 = arr.reduce((r, obj) => r.concat(obj.member.filter((m) => r.every(existingM => existingM.id !== m.id))), []);

 var arr = [{ "taxname": "MFM", "member": [{ "id": 1334, "name": "Mary G. King", }, { "id": 1324, "name": "Bonnie A. Wilson", }, { "id": 1336, "name": "Samantha B. Sellers", }] }, { "taxname": "Test purpose", "member": [{ "id": 1336, "name": "Samantha B. Sellers", }] }, { "taxname": "New_Test_MF", "member": [{ "id": 1334, "name": "Mary G. King", }] } ]; // Alternative #1 const existingIds = {}; const result = arr.reduce((r, obj) => r.concat(obj.member.filter((m) => { if (existingIds.hasOwnProperty(m.id.toString())) { return false; } existingIds[m.id] = true; return true; })), []); // Alternative #2 const array2 = arr.reduce((r, obj) => r.concat(obj.member), []); const nonDuplicateIds = Array.from(new Set(array2.map(m => m.id))) const result2 = nonDuplicateIds.map(id => array2.find(member => member.id === id)) // You could also use an object for faster lookup // Alternative #3 const members = {}; arr.forEach(data => data.member.forEach((member) => members[member.id] = member)); const result3 = Object.values(members); // Alternative #4 const result4 = arr.reduce((r, obj) => r.concat(obj.member.filter((m) => r.every(existingM => existingM.id.== m,id))); []). console.log(result;length). console.log(result2;length). console.log(result3;length). console.log(result4;length);

你可以在 ES10 中使用flat function

 var arr = [{ "taxname": "MFM", "member": [{ "id": 1334, "name": "Mary G. King", }, { "id": 1324, "name": "Bonnie A. Wilson", }, { "id": 1336, "name": "Samantha B. Sellers", }] }, { "taxname": "Test purpose", "member": [{ "id": 1336, "name": "Samantha B. Sellers", }] }, { "taxname": "New_Test_MF", "member": [{ "id": 1334, "name": "Mary G. King", }] } ]; var test = arr.map(a => a.member).flat(); var filterd = [...new Set(test.map(t=>t.id))].map(id => test.find(tt => tt.id === id)); console.log(filterd)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM