如何在多个数组中循环以找到共同点
How to loop through multiple arrays to find something common
所以我有4个数组,每个数组都包含名称。该数组返回一个名称为或为null的数组。名称在一个数组中是唯一的,但该名称可能出现在不同的数组中。某些数组可能为null。一个例子:
例如。Array 1 = [Bob, Sam, Mary, Jake]
;Array 2 = [Sam, Jacob, Tom]
;Array 3 = null
;Array 4= [Stephanie, Sam]
等
我想做的是获得所有数组中常见的所有字符串。这就是我的想法:检查数组是否为null,然后将非null的数组放在一个名为"notNull"的数组中。然后循环遍历notNull中的每个单独的元素(它们是一个数组),然后将数组中常见的名称存储在一个变量中。所以在当前的例子中,Sam应该被打印出来。
您可以使用array.prototype.every来检查项目是否存在于所有数组中:
var arr1 = ["a","b","c"];
var arr2 = ["c","d","e"];
var arr3 = ["f","g","c"];
var exists = [arr1,arr2,arr3].every(function(arr){return arr.indexOf("c") > -1}); // true
var exists2 = [arr1,arr2,arr3].every(function(arr){return arr.indexOf("a") > -1}); // false
您可以使用array.prototype.reduce在多个阵列上进行筛选:
[arr1,arr2,arr3].reduce(function(a1,a2){
return a1.filter(function(item){ return a2.indexOf(item) > -1 })}, arr1);
这里有一种方法,从参数创建一个数组,使用Array.isArray
删除null
,从第一个数组开始,然后只使用filter
,其中的名称基于.every
,其余数组中的一个也有该名称。
function common() {
var args = [].slice.call(arguments).filter(Array.isArray);
return args.shift().filter(function(name) {
return args.every(function(arr) {
return arr.indexOf(name) !== -1;
});
});
}
var commonNames = common(arr1, arr2, arr3, arr4 ....);
function common() {
var args = [].slice.call(arguments).filter(Array.isArray);
return args.shift().filter(function(name) {
return args.every(function(arr) {
return arr.indexOf(name) !== -1;
});
});
}
var arr1 = ["Bob", "Sam", "Mary", "Jake"];
var arr2 = ["Sam", "Jacob", "Tom"];
var arr3 = null;
var arr4 = ["Stephanie", "Sam"];
var result = common(arr1, arr2, arr3, arr4);
document.body.innerHTML = '<pre>' + JSON.stringify( result, null, 4 ) + '</pre>';
此代码将忽略空数组并返回所有匹配项:
var array1 = ["Bob", "Sam", "Mary", "Jake"];
var array2 = ["Sam", "Jacob", "Tom"];
var array3 = null;
var array4 = ["Stephanie", "Sam"]
var commonNames = getCommonItems([array1, array2, array3, array4])
document.write(JSON.stringify(commonNames)) // example output
// Function
function getCommonItems(arraysToSearch) {
var commonItems = []
var started = false
for (var i = 0; i < arraysToSearch.length; ++i) {
if (arraysToSearch[i] == null) continue
if (started == false) {
for (var j = 0; j < arraysToSearch[i].length; ++j) {
commonItems.push(arraysToSearch[i][j])
}
started = true
} else {
for (var j = 0; j < commonItems.length; ++j) {
if (arraysToSearch[i].indexOf(commonItems[j]) == -1) {
commonItems.splice(j, 1);
if(commonItems.length == 0) return []
}
}
}
}
return commonItems
}
也许您可以在这里尝试数组的下划线交集函数:
_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
// will return [1, 2]
不要忘记将空数组替换为[]
Remarque:它也适用于任何javascript对象(字符串…)。
以下是我手动执行此操作的方式(无库)。
计算非null数组的数量,这是您期望遇到每个名称的预期次数。
将每个名称存储在一个对象中,其中键是名称,遇到的次数是值。
使用遇到的计数为预期计数(非null数组的数量)的名称构建数组。
https://jsfiddle.net/quu66jp1/
// An array of your arrays
var arrays = [
["Bob", "Sam", "Mary", "Jake"],
["Sam", "Jacob", "Tom"],
null,
["Stephanie", "Sam"]
];
var names = {};
var expectedCount = 0;
var result = [];
// Build out the "names" object, will contain each name as a key and
// the number of times encountered as a value
for (var i=0, il=arrays.length; i<il; i++) {
if (arrays[i] !== null) {
expectedCount++;
for (var j=0, jl=arrays[i].length; j<jl; j++) {
if (!names[arrays[i][j]]) names[arrays[i][j]] = 0;
names[arrays[i][j]] ++;
}
}
}
// Build your result array with only the names that have been found
// the number of times as how many arrays were looped through.
for (var name in names) {
if (names[name] == expectedCount) {
result.push(name);
}
}
console.log(result);
- jQuery:循环一个具有不同超时值的循环
- 在循环中分配json值时,值被覆盖
- 如何在下面的ES6循环中获得前面的文本
- 为什么“;未定义的“;在JavaScript中结束循环
- Javascript循环不会自我更新
- 如何使用jquery处理php循环通过元素
- 而循环只设置php中输入字段中的第一个值
- 循环遍历数组中的特定索引
- Javascript返回值只在循环中返回一次
- 按照选项卡索引的顺序循环一个jQuery选择
- 循环遍历以数组为值的Javascript对象
- 为什么JavaScript在for循环为3时向所有4发出警报
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 循环结束/推送到数组之前在页面上呈现EJS
- 循环比赛位置算法
- jQuery循环在特定位置暂停
- 我的javascript for循环不起作用
- 循环浏览多个身体背景图像
- W3C循环样式的JavaScript
- 如何在多个数组中循环以找到共同点