在不使用数组方法的情况下避免嵌套的for循环

时间:2019-05-15 12:16:05

标签: javascript for-loop

说我有两个对象数组。喜欢

var name = [
    { name : 'john' },
    { name : 'doe' }
]
var name2 = [
    { name : 'john' },
    { name : 'does' }
]

我想检查第一个数组中的名称是否与第二个数组中的名称相同,并返回响应。我将在下面进行

for(var i = 0; i < name.length; i++) {
    for(var j = 0; j < name2.length; j++) {
        if(name[i].name === name2[j].name) {
            console.log('good')
        } else {
            console.log('bad');
        }
    }
}

上面的代码将给出以下结果

good
bad 
bad
bad

如何在不使用嵌套的for循环的情况下达到相同的结果?

我尝试使用forEach一次遍历。喜欢

name.forEach(function(value, index) {
    if(value.name === name2[index].name) {
        console.log('good');
    }
    console.log('bad')
});

但这不起作用,并且当它们是不同长度的数组时会出现问题。

我所有的研究都导致使用filtermapreduce ...方法。我想仅使用for循环来实现这一点。谢谢。

4 个答案:

答案 0 :(得分:2)

来自

  

我尝试使用forEach。但这不起作用,并且当它们是不同长度的数组时会产生问题。

我收集到您想比较两个数组,而不考虑其长度。因此,您可以使用Math.max从2个数组中获得最大长度。然后,遍历并检查2个数组在每个索引处是否具有相同的值

当较小的数组在指定的索引处没有值时,条件name1[i] && name2[i]将检查undefined

var name1 = [
    { name : 'john' },
    { name : 'doe' }
]
var name2 = [
    { name : 'john' },
    { name : 'does' },
    { name : 'jane' }
]

var maxLength = Math.max(name1.length, name2.length);

for (var i = 0; i < maxLength; i++) {
  if (name1[i] && name2[i] && name1[i].name === name2[i].name)
    console.log("good")
  else
    console.log("bad")
}

答案 1 :(得分:1)

您可以尝试以下代码:

var arr = [
    { name : 'john' },
    { name : 'doe' }
]
var arr2 = [
    { name : 'john' },
    { name : 'peter' },
    { name : 'doe' }
]

var i = 0, length = Math.min(arr.length, arr2.length);

for(i; i < length; i++) {
    if(arr[i].name === arr2[i].name) {
            console.log('good')
        } else {
            console.log('bad');
     }
}

答案 2 :(得分:0)

您不必有2个循环。您可以执行以下操作:将数组映射到一个对象,对两个数组都具有以下结构:

// first array
{
"jhon": 1, //count how many names u have in each array
"otherName": 1
}

// second array
{
"jhon": 1, //count how many names u have in each array
"otherName": 1
}

,然后只比较这两个数组。更快更干净的imo。

答案 3 :(得分:0)

另一种使用“地图”功能的解决方案,以避免使用嵌套循环。不确定是否能回答整个问题,但希望能对您有所帮助。

//var search_value = 'john'; // will print 'good'
var search_value = 'doe'; // will print 'bad'

var name1 = [
    { name : 'john' },
    { name : 'doe' }
];

var name2 = [
    { name : 'john' },
    { name : 'does' }
];

var pos1 = name1.map(function(element) { return element.name; }).indexOf(search_value);
var pos2 = name2.map(function(element) { return element.name; }).indexOf(search_value);

var result = (pos1 == pos2) ? 'good' : 'bad';
console.log(result)