按对象ID

时间:2017-05-11 09:57:31

标签: javascript arrays

我搜索了SO的方法,但大多数问题只支持两个数组(我需要一个多个数组的解决方案)。

我不想比较确切的对象,我想通过ID来比较对象,因为它们的其他参数可能不同。

所以这是示例数据:

data1 = [{'id':'13','name':'sophie'},{'id':'22','name':'andrew'}, etc.]
data2 = [{'id':'22','name':'mary'},{'id':'85','name':'bill'}, etc.]
data3 = [{'id':'20','name':'steve'},{'id':'22','name':'john'}, etc.]
...

我想返回ID出现在所有数组中的所有对象,我不介意返回匹配对象集合中的

因此,根据上面的数据,我希望返回以下任何一项:

{'id':'22','name':'andrew'}
{'id':'22','name':'mary'}
{'id':'22','name':'john'}

由于

4 个答案:

答案 0 :(得分:0)

它的循环太多但是,如果你能找到所有数组中存在的公共id,那么它会让你的发现变得更容易。你可以有一个数组值作为参考来找到共同的id

var global = [];
for(var i = 0;i<data1.length;i++){
var presence = true;
for(var j=0;j<arrays.length;j++){
    var temp = arrays[j].find(function(value){
        return data1[i].id == value.id;
    });
    if(!temp){
        presence = false;
        break;
    }
}
    if(presence){
       global.push(data1[i].id)
    }
}
console.log(global);

&#13;
&#13;
var data1 = [{'id':'13','name':'sophie'},{'id':'22','name':'andrew'}];
var data2 = [{'id':'22','name':'mary'},{'id':'85','name':'bill'}];
var data3 = [{'id':'20','name':'steve'},{'id':'22','name':'john'}];
var arrays = [data1, data2, data3];
var global = [];
for(var i = 0;i<data1.length;i++){
    var presence = true;
	for(var j=0;j<arrays.length;j++){
		var temp = arrays[j].find(function(value){
			return data1[i].id == value.id;
		});
		if(!temp){
			presence = false;
            break;
		}
	}
if(presence){
 global.push(data1[i].id)
}
}
console.log(global);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

首先,您确实需要一个数组数组 - 使用数字后缀是不可扩展的:

let data = [ data1, data2, ... ];

由于您已确认每个子数组中的ID都是唯一的,因此您可以通过合并数组来简化问题,然后找出哪些元素出现n次,其中n是子数组的原始数量:

let flattened = data.reduce((a, b) => a.concat(b), []);

let counts = flattened.reduce(
    (map, { id }) => map.set(id, (map.get(id) || 0) + 1), new Map()
);

然后你可以选出那些出现n次的对象,在这个简单的版本中,它们都来自第一个子数组:

let found = data[0].filter(({ id }) => counts.get(id) === data.length);

从每个子阵列中挑选一个任意(唯一)匹配会有些困难,虽然只挑选一行data并从中挑选项目相对容易。要么满足问题的约束。

答案 2 :(得分:0)

有人提到你需要 n 数组,但是,鉴于你可以:

  

将所有数组放入一个名为data

的数组中
你可以:

  • 合并您的数组
  • 获取重复ID列表(通过ID排序)
  • 使该列表唯一(唯一ID列表)
  • 在合并列表中查找与唯一ID匹配的条目
  • 其中这些项的计数与原始数组的数量匹配

示例代码:

&#13;
&#13;
// Original data
var data1 = [{'id':'13','name':'sophie'},{'id':'22','name':'andrew'}]
var data2 = [{'id':'22','name':'mary'},{'id':'85','name':'bill'}]
var data3 = [{'id':'13','name':'steve'},{'id':'22','name':'john'}]

var arraycount = 3;

// Combine data into a single array

// This might be done by .pushing to an array of arrays and then using .length

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort?v=control
var data = [].concat(data1).concat(data2).concat(data3);
//console.log(data)

// Sort array by ID
// http://stackoverflow.com/questions/840781/easiest-way-to-find-duplicate-values-in-a-javascript-array
var sorted_arr = data.slice().sort(function(a, b) {
  return a.id - b.id;
});
//console.log(sorted_arr)

// Find duplicate IDs
var duplicate_arr = [];
for (var i = 0; i < data.length - 1; i++) {
  if (sorted_arr[i + 1].id == sorted_arr[i].id) {
    duplicate_arr.push(sorted_arr[i].id);
  }
}

// Find unique IDs
// http://stackoverflow.com/questions/1960473/unique-values-in-an-array
var unique = duplicate_arr.filter(function(value, index, self) {
  return self.indexOf(value) === index;
});
//console.log(unique);

// Get values back from data
//https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter?v=control
var matches = [];
for (var i = 0; i < unique.length; ++i) {
  var id = unique[i];
  matches.push(data.filter(function(e) {
    return e.id == id;
  }))
}
//console.log(matches)
// for data set this will be 13 and 22

// Where they match all the arrays
var result = matches.filter(function(value, index, self) {
  return value.length == arraycount;
})
//console.log("Result:")
console.log(result)
&#13;
&#13;
&#13;

注意: 非常可能是更有效的方法。。我离开了这个,希望它可以帮助某人

答案 3 :(得分:0)

var arr1 = ["558", "s1", "10"]; 
var arr2 = ["55", "s1", "103"]; 
var arr3 = ["55", "s1", "104"]; 
var arr = [arr1, arr2, arr3]; 
   
console.log(arr.reduce((p, c) => p.filter(e => c.includes(e))));   
 
// output ["s1"]