如果嵌入forEach被忽略

时间:2018-02-14 18:17:02

标签: javascript arrays

我在跟随一段代码时遇到了麻烦:

function isUniform (arr) {
    arr.forEach (function (el){
        console.log (el);
        if (arr [0] !== el) {
            return (false);
        }
    })
    return (true);
}

console.log (isUniform ([1, 1, 1, 1]));
console.log (isUniform ([2, 1, 1, 1]));
console.log (isUniform (["a", "b", "p"]));
console.log (isUniform (["b", "b", "b"]));

它应该返回" true"当数组中的所有元素都相同时," false"否则,它会继续返回" true"并且通过测试我发现JavaScript跳过了唯一的" if"言。

编辑:不重复,因为我在自己的代码上征求意见。具体说明为什么" if"嵌套在forEach中的语句被忽略,这在其他问题中没有涉及。

4 个答案:

答案 0 :(得分:1)

[1,1,1,1].every( (val, i, arr) => val === arr[0] )  //True
[1,1,2,1].every( (val, i, arr) => val === arr[0] )  //False

如提到in this post

答案 1 :(得分:0)

.forEach忽略了回调的结果,并且是错误的工作工具,因为你基本上重新实现了.every(),它具有一旦知道它就停止迭代的额外优势无法返回true

function isUniform (arr) {
    return arr.every(function (el){
        return arr[0] === el
    });
}

console.log (isUniform ([1, 1, 1, 1]));
console.log (isUniform ([2, 1, 1, 1]));
console.log (isUniform (["a", "b", "p"]));
console.log (isUniform (["b", "b", "b"]));

如果您打算自己实现它,我会使用for-of循环,以便您可以退出。

function isUniform (arr) {
    for (const el of arr) {
        if (el !== arr[0]) {
            return false;
        }
    }
    return true;
}

console.log (isUniform ([1, 1, 1, 1]));
console.log (isUniform ([2, 1, 1, 1]));
console.log (isUniform (["a", "b", "p"]));
console.log (isUniform (["b", "b", "b"]));

答案 2 :(得分:0)

return false;函数中的forEach只会破坏传递的回调。

添加一个变量来存储布尔值。

function isUniform (arr) {
    var result = true;
    arr.forEach (function (el) {
        console.log (el);
        if (arr [0] !== el) {
            result = false;
        }
    });

    return result;
}

答案 3 :(得分:0)

function isUniform (arr) {
  let flag = true;

  arr.forEach (function (el){
    console.log (el);
    if (arr[0] !== el) {
      flag = false;
    }
  })
  return flag;
}

console.log (isUniform ([1, 1, 1, 1]));
console.log (isUniform ([2, 1, 1, 1]));
console.log (isUniform (["a", "b", "p"]));
console.log (isUniform (["b", "b", "b"]));