所以我有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应该打印出来。
答案 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)
此代码将忽略空数组并返回所有匹配项:
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;
答案 3 :(得分:0)
也许您可以尝试数组underscore的look 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);