javascript - JavaScript 中 "intersect"两个 JSON 对象数组的公共(public)属性的最佳方法?

标签 javascript arrays json

假设我们有两个 JSON 对象数组,arr1arr2,它们共享一个公共(public)属性 id:

var arr1 = [{'id':10,'value1':'a1'},
            {'id':11,'value1':'b1'},
            {'id':12,'value1':'c1'},
            {'id':13,'value1':'d1'},
            {'id':14,'value1':'e1'}];

var arr2 = [{'id':100000,'value2':'a2'},
            {'id':11,'value2':'b2'},
            {'id':100002,'value2':'c2'},
            {'id':100003,'value2':'d2'},
            {'id':14,'value2':'e2'}];

我需要从 ID 匹配的两个数组中提取“值”项,即预期输出为:

[0] value1: b1, value2: b2
[1] value1: e1, value2: e2

我有一个嵌套循环解决方案的工作示例(见下文),但速度很慢(想象一下这些数组很大,每次迭代都涉及一些 UI 操作),所以我真的希望有一个更优雅、更快速的解决方案为此。

var arr1 = [{'id':10,'value1':'a1'},
            {'id':11,'value1':'b1'},
            {'id':12,'value1':'c1'},
            {'id':13,'value1':'d1'},
            {'id':14,'value1':'e1'}];

var arr2 = [{'id':100000,'value2':'a2'},
            {'id':11,'value2':'b2'},
            {'id':100002,'value2':'c2'},
            {'id':100003,'value2':'d2'},
            {'id':14,'value2':'e2'}];

for (var i = 0, len1 = arr1.length; i < len1; i++) {
	for (var j = 0, len2 = arr2.length; j < len2; j++) {
		if (arr1[i].id === arr2[j].id) {
			theFunction(arr1[i].value1, arr2[j].value2);
			break;
		}
	}
}

function theFunction(value1, value2) {
  var div = document.getElementById('out');
  div.innerHTML += '<br />value1: ' + value1 + ', value2: ' + value2;
}
<div id='out'>
</div>

最佳答案

构建 idvalue1 的映射,然后遍历 arr2 以匹配它们:

var arr1 = [{'id':10,'value1':'a1'},
            {'id':11,'value1':'b1'},
            {'id':12,'value1':'c1'},
            {'id':13,'value1':'d1'},
            {'id':14,'value1':'e1'}];

var arr2 = [{'id':100000,'value2':'a2'},
            {'id':11,'value2':'b2'},
            {'id':100002,'value2':'c2'},
            {'id':100003,'value2':'d2'},
            {'id':14,'value2':'e2'}];

var value1s = {};

arr1.forEach(function(item) {
  value1s[item.id] = item.value1;
});

arr2.forEach(function(item) {
  if (item.id in value1s) {
    theFunction(value1s[item.id], item.value2);
  }
});

function theFunction(value1, value2) {
  var div = document.getElementById('out');
  div.innerHTML += '<br />value1: ' + value1 + ', value2: ' + value2;
}
<div id='out'>
</div>

关于javascript - JavaScript 中 "intersect"两个 JSON 对象数组的公共(public)属性的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35929265/

相关文章:

javascript - 基本 Accordion 下拉使用 java 脚本和 css 不工作。我怎样才能让它旁边没有符号?

html - 如何在 d3 js 中将图形与各自的矩形节点大小对齐

php - 如果键值存在,则随机取消设置多维数组中的元素

c# - 序列化C#对象,想反序列化为接口(interface)

json - 在 Hive 中映射 JSON,其中嵌套字段具有下划线

javascript - 替换 tbody 中的内容,除了一个 tr

javascript - Kendo 数字文本框最小最大值不起作用

c# - 来自 C# 代码的 Javascript 仅在 Google Chrome 中刷新

c - C标准是否要求n个元素数组的大小是元素大小的n倍?

java - 整数数组(Java)