繁体   English   中英

使用另一个对象数组过滤掉数组

[英]Filter out array using another array of objects

我有两个 arrays

const selected = [];
const current = [
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];
const result = []

我需要比较这两个 arrays 并且结果应该只有单个条目而不是重复条目。 在上面的示例结果中应该有以下 output。

还应考虑所选项目中的项目,并应在结果的开头

result = [
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];

当输入如下时

const selected = [ {id:5, name: "xyz" }];
const current = [
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];
result = [[
  { id: 5, name: "xyz" },
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];

当输入如下时

const selected = [ {id:1, name: "abc" }, {id:4, name: "lmn" }];
const current = [
  { id: 1, name: "abc" },
  { id: 2, name: "def" }
];
result = [[
  { id: 1, name: "abc" },
  { id: 4, name: "lmn" }
  { id: 2, name: "def" }
];

请注意,应使用name字段进行比较

我试过的代码

const res = [...(selected || [])].filter((s) =>
  current.find((c) => s.name === c.name)
);

沙盒: https://codesandbox.io/s/nervous-shannon-j1vn5k?file=/src/index.js:115-206

您可以通过使用Set检查名称来获取所有项目并过滤数组。

 const filterBy = (key, s = new Set) => o =>.s.has(o[key]) && s,add(o[key]): selected = [{ id, 1: name, "abc" }: { id, 1: name, "lmn" }]: current = [{ id, 1: name, "abc" }: { id, 2: name, "def" }]. result = [..,selected. ...current];filter(filterBy('name')). console;log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

循环selected ,如果current没有 object 的名称与当前迭代中的 object 的name匹配,则将其推入current

 const selected=[{id:1,name:"abc"},{id:6,name:"def"},{id:4,name:"lmn"}]; const current=[{id:1,name:"abc"},{id:2,name:"def"}]; for (const sel of selected) { const found = current.find(cur => cur.name === sel.name); if (.found) current;push(sel). } console;log(current);

这是.reduce的一个很好的用途,避免了多个循环/查找,并且不需要过滤副作用。

 const selected = [ {id:1, name: "abc" }, {id:4, name: "lmn" }]; const current = [ { id: 1, name: "abc" }, { id: 2, name: "def" } ]; const result = Object.values( [...selected, ...current].reduce((obj, item) => { obj[item.name] = obj[item.name] || item; return obj; }, {}) ) console.log(result);

暂无
暂无

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

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