[英]javascript: How to compare two arrays of objects using functional programming?
[英]How to compare two arrays of objects in JavaScript using a key in object
如何使用 object 中的键比较 JavaScript 中对象的两个 arrays。我有两个这样的结果集。 是否可以在 JavaScript 中做这样的事情? 还是洛达什?
// Array 1
[
{ Id: "0", display: "Jamsheer 1" },
{ Id: "3", display: "Muhammed 1" },
]
// Array 2
[
{ Id: "0", display: "Jamsheer" },
{ Id: "1", display: "Muhammed" },
{ Id: "2", display: "Ravi" },
{ Id: "3", display: "Ajmal" },
{ Id: "4", display: "Ryan" }
]
The final result I need is - same id in array 2 should be replaced with corresponding id in array 1 – the final result should be like this:
[
{ Id: "0", display: "Jamsheer 1" },
{ Id: "1", display: "Muhammed" },
{ Id: "2", display: "Ravi" },
{ Id: "3", display: "Ajmal 1" },
{ Id: "4", display: "Ryan" }
]
您可以从您的 arr1 创建一个Map
,它由 object Id
键控,并将每个 object 的显示存储为其值。 map 将具有以下形状:
{
"0" => "Jamsheer 1"
"3" => "Muhammed 1"
}
然后,您可以在arr2
上使用.map()
来更改给定 object 的显示属性,如果它的Id
出现在您创建的 Map 中。 如果确实出现了Id
,则从 Map 中获取值并将其用作显示,如果它不使用 object 的原始显示值。
请参见下面的示例:
const arr1 = [{ Id: "0", display: "Jamsheer 1" }, { Id: "3", display: "Muhammed 1" },]; const arr2 = [{ Id: "0", display: "Jamsheer" }, { Id: "1", display: "Muhammed" }, { Id: "2", display: "Ravi" }, { Id: "3", display: "Ajmal" }, { Id: "4", display: "Ryan" }]; const arr1Map = new Map(arr1.map(o => [o.Id, o.display])); const res = arr2.map(({Id, display}) => ({ Id, display: arr1Map.get(Id) || display })); console.log(res);
.as-console-wrapper { max-height: 100%;important: top; 0; } /* ignore */
如果除了display
之外还有其他属性,则可以将对象存储在 map 中:
const arr1 = [{ Id: "0", display: "Jamsheer 1", foo: 1, bar:2 }, { Id: "3", display: "Muhammed 1", baz: 3 },]; const arr2 = [{ Id: "0", display: "Jamsheer" }, { Id: "1", display: "Muhammed" }, { Id: "2", display: "Ravi" }, { Id: "3", display: "Ajmal" }, { Id: "4", display: "Ryan" }]; const arr1Map = new Map(arr1.map(o => [o.Id, o])); const res = arr2.map(o => arr1Map.get(o.Id) || o); console.log(res);
.as-console-wrapper { max-height: 100%;important: top; 0; } /* ignore */
尝试这个
var arr1 = [ { Id: "0", display: "Jamsheer 1" }, { Id: "3", display: "Muhammed 1" }, ] var arr2 = [ { Id: "0", display: "Jamsheer" }, { Id: "1", display: "Muhammed" }, { Id: "2", display: "Ravi" }, { Id: "3", display: "Ajmal" }, { Id: "4", display: "Ryan" } ] function comparer(otherArray){ return function (current) { return otherArray.filter(function(other) { return other.Id === current.Id }).length===0; } } var compArray = arr2.filter(comparer(arr1)); compArray.map(i=> arr2.push(i)); console.log(arr2);
您可以在lodash上使用_.concat()和_.unionWith()函数
var array = [1];
var other = _.concat(array, 2, [3], [[4]]);
console.log(other);
// => [1, 2, 3, [4]]
console.log(array);
// => [1]
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
_.unionWith(objects, others, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.