按对象 ID 查找多个数组中的常见对象



我已经搜索了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'}

谢谢

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

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并从中挑选项目相对容易。 两者都将满足问题的约束。

If you want the unique object by Name
data1 = [{'id':'13','name':'sophie'},{'id':'22','name':'mary'}]
data2 = [{'id':'26','name':'mary'},{'id':'85','name':'bill'}]
data3 = [{'id':'29','name':'sophie'},{'id':'22','name':'john'}]

flattened = [ ...data1, ...data2, ...data3 ];
counts = flattened.reduce(
    (map, { name }) => map.set(name, (map.get(name) || 0) + 1), new Map()
);
names = []
found = flattened.filter(({ name }) => {
    if ((counts.get(name) > 1) && (!names.includes(name))) {
        names.push(name);
        return true
    }
    return false
});

它的循环太多了,但是,如果你能找到所有数组中存在的公共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);

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);

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

将所有数组放入名为 data 的数组中

您可以:

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

示例代码:

// 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)

注意:很可能有更有效的方法。 我留下这个是希望它的一部分可以帮助某人

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"]

最新更新