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