如何在多个数组中循环以找到共同点

How to loop through multiple arrays to find something common

本文关键字:循环 共同点 数组      更新时间:2023-09-26

所以我有4个数组,每个数组都包含名称。该数组返回一个名称为或为null的数组。名称在一个数组中是唯一的,但该名称可能出现在不同的数组中。某些数组可能为null。一个例子:

例如。Array 1 = [Bob, Sam, Mary, Jake]Array 2 = [Sam, Jacob, Tom]Array 3 = nullArray 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);