Javascript 如何在多个数组中循环查找常见的内容
所以我有4个数组,其中每个数组都包含名称。该数组返回一个name或null的数组。名称在数组中是唯一的,但该名称可能出现在不同的数组中。某些数组可能为空。例如: 例如。Javascript 如何在多个数组中循环查找常见的内容,javascript,Javascript,所以我有4个数组,其中每个数组都包含名称。该数组返回一个name或null的数组。名称在数组中是唯一的,但该名称可能出现在不同的数组中。某些数组可能为空。例如: 例如。 Array 1=[Bob,Sam,Mary,Jake]; Array 2=[Sam,Jacob,Tom]; Array 3=null数组4=[Stephanie,Sam]等 我要做的是获取所有数组中的公共字符串。 这就是我的想法:检查数组是否为null,然后将不为null的数组放入一个名为“notNull”的数组中。然后循环no
Array 1=[Bob,Sam,Mary,Jake]
;
Array 2=[Sam,Jacob,Tom]
;
Array 3=null
<代码>数组4=[Stephanie,Sam]等
我要做的是获取所有数组中的公共字符串。
这就是我的想法:检查数组是否为null,然后将不为null的数组放入一个名为“notNull”的数组中。然后循环notNull中的每个单独元素(数组),然后将数组中常见的名称存储在变量中。因此,在本例中,应打印Sam。可用于检查所有数组中是否存在项:
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
可用于在多个阵列上进行筛选:
[arr1,arr2,arr3].reduce(function(a1,a2){
return a1.filter(function(item){ return a2.indexOf(item) > -1 })}, arr1);
也许您可以尝试阵列的交集函数:
不要忘记将空数组替换为[]
Remarque:它也适用于任何javascript对象(字符串…)。此代码将忽略空数组并返回所有匹配项:
var array1=[“鲍勃”、“萨姆”、“玛丽”、“杰克”];
var array2=[“萨姆”、“雅各布”、“汤姆”];
var array3=null;
var array4=[“Stephanie”,“Sam”]
var commonNames=getCommonItems([array1,array2,array3,array4])
document.write(JSON.stringify(commonNames))//示例输出
//作用
函数getCommonItems(arraysToSearch){
var commonItems=[]
var start=false
对于(变量i=0;i }
以下是我将如何手动执行此操作(无库)
计算非空数组的数量,这是您预期遇到每个名称的次数
将每个名称存储在对象中,其中键是名称,遇到它的次数是值
使用其遇到的计数为预期计数(非空数组数)的名称构建一个数组
//数组的数组
变量数组=[
[“鲍勃”、“萨姆”、“玛丽”、“杰克”],
[“山姆”、“雅各布”、“汤姆”],
无效的
[“斯蒂芬妮”、“山姆”]
];
变量名称={};
var expectedCount=0;
var结果=[];
//构建“names”对象,将每个名称作为键和
//作为值遇到的次数
对于(var i=0,il=arrays.length;i这里有一种方法,使用array.isArray
从第一个数组开始删除null
,然后根据是否筛选其中的名称。每个其余数组中的一个也有该名称
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 ....);
函数公共(){
var args=[].slice.call(arguments).filter(Array.isArray);
返回args.shift().filter(函数(名称){
返回args.every(函数(arr){
返回arr.indexOf(name)!=-1;
});
});
}
var arr1=[“鲍勃”、“萨姆”、“玛丽”、“杰克”];
var arr2=[“萨姆”、“雅各布”、“汤姆”];
var arr3=null;
var arr4=[“斯蒂芬妮”、“萨姆”];
var结果=普通(arr1、arr2、arr3、arr4);
document.body.innerHTML=''+JSON.stringify(结果,null,4)+'';
如果数组3不包含Sam,为什么要打印它呢?你的意思是程序将从notNull数组打印公共名称吗?@WayneOlinger忘了说应该打印它,因为Sam在notNulls数组中是公共的。所有数组都包含所有元素,然后计算每个元素的出现次数。@TarikhChouhan也许是你可以尝试下划线,正如我在回答中提到的;)它不应该检查给定的名称,它应该检查是否是任何名称,在notNull数组中是CommonThank。我试过你的方法,效果很好。解决这个问题对我来说太复杂了。你一定很好。你能解释一下JSON.stringfy的作用吗?我很高兴它帮助了你JSON.stringfy
将JavaScript对象转换为字符串,因此您可以在示例output.Btw中读取它。性能方面,这应该是最好的,你可以得到哦,我看到。你是当场想到的还是通过你的编码经验知道该由谁来做?我真的很惊讶。我已经试着解决这个问题超过15个小时了!我通常在万不得已的时候咨询StackOverFlow,因为我想尝试自己解决它。我看到了这个问题,我可以想象如何解决它。然后我开始编码,并在飞行中完成。大约花了15分钟。这主要是通过编码的经验。尝试解决问题会带你去那里,你会走上好的道路!
// 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);
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 ....);