如何遍历多个数组以查找常见的

时间:2015-12-23 16:42:48

标签: javascript

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

E.g。 Array 1 = [Bob, Sam, Mary, Jake]; Array 2 = [Sam, Jacob, Tom]; Array 3 = null; Array 4= [Stephanie, Sam]

我想要做的是获取所有数组中常见的所有字符串。 这就是我想到的:检查数组是否为null,然后将一个非空的数组放在一个名为“NoNull'”的数组中。然后遍历notNull中的每个单独元素(它们是一个数组),然后将数组中常见的名称存储在变量中。所以在这个当前的例子中,Sam应该打印出来。

5 个答案:

答案 0 :(得分:4)

您可以使用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);

答案 1 :(得分:3)

这是一种方法,从参数创建一个数组,使用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>';

  <telerik:GridViewComboBoxColumn>
            <telerik:GridViewComboBoxColumn.ItemTemplate>
                <DataTemplate>
                    <TextBlock>
                        <TextBlock.Text>
                            <MultiBinding diagnostics:PresentationTraceSources.TraceLevel="High" Converter="{StaticResource sensorCountConverter}">
                                <Binding Path="NumberPhase" />
                                <Binding Path="Data.PanelConfig.ID" Source="{StaticResource editedLocation}" />
                            </MultiBinding>
                        </TextBlock.Text>
                    </TextBlock>
                </DataTemplate>
            </telerik:GridViewComboBoxColumn.ItemTemplate>
        </telerik:GridViewComboBoxColumn>

答案 2 :(得分:2)

此代码将忽略空数组并返回所有匹配项:

&#13;
&#13;
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
}
&#13;
&#13;
&#13;

答案 3 :(得分:0)

也许您可以尝试数组underscorelook here交叉函数:

    _.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
    // will return [1, 2]

不要忘记将null数组替换为[]

Remarque :它也适用于任何javascript对象(字符串...)。

答案 4 :(得分:0)

以下是我手动执行此操作的方法(无库)。

计算非空数组的数量,这是您期望遇到每个名称的预期次数。

将每个名称存储在一个对象中,其中键是名称,遇到的次数是值。

使用其遇到的计数是预期计数(非空数组的数量)的名称构建一个数组。

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