javascript - JS-Traversal-Problem?
大家讲道理
大家讲道理 2017-06-30 09:57:33
0
5
743

Ich muss herausfinden, ob das Array unterschiedliche Werte enthält. Wenn es vorhanden ist, führen Sie die Funktion x aus. Wenn es nicht vorhanden ist, führen Sie die Funktion y aus. Wenn Sie jedoch eine for-Schleife verwenden und zuerst auf dasselbe stoßen, wird y ausgeführt, und x wird erst ausgeführt, wenn Sie auf eine andere stößt. Wie lässt sich die entsprechende Funktion ausführen, nachdem sie alle durchlaufen hat?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

Antworte allen(5)
伊谢尔伦

使用 Array.prototype.every() 或者 Array.prototype.some()

Ty80

1.使用 ES5 array.every 方法,它对每个数组元素执行函数,当所有函数执行结果都是true,则最终结果是 true.否则会提前结束并得到false.

2.使用for循环,你需要一个变量,来保存数组的第一个的元素值,然后开始循环,当发现数组中有元素不等于你的变量时,你就能确定该执行X了(此时就可以break掉);否则,就是数组中没有不同值,执行Y

其实方法 1 也需要这个变量.

3.使用ES5 array.reduce 方法,它一次接受两个数组元素,你直接比较两个元素是不是相等就可以了.只要出现不相等,就是Y.

[1,1,1,1,4,1].reduce(function (a,b) {
    console.log(a,b, a === b);
    // 返回后一个元素
    return b;
})

但这个方法不能break

伊谢尔伦

for之前加个变量,for里遇到就改下,for后再if

刘奇

用for循环的话,需要在for外面定义一个变量作为标志位:

const arr = [1, 2, 3, 5, 6, 6 , 7];
let has = false;
for(let i = 0; i < arr.length; i++) {
    if (arr.indexOf(arr[i]) !== i) {
        has = true;
        break;
    }
};
if (has) {
    console.log('x');
} else {
    console.log('y');
}

如果支持ES6的话,可以用Set给数组去重,然后判断两个数组长度:

const arr = [1, 2, 3, 5, 6, 6, 7];
const arr1 = Array.from(new Set(arr));
console.log(arr.length === arr1.length);
学霸

这个“存在不一样的值”描述的有点模糊,我的理解是数组里存在一个值跟其它值不一样。

  1. // 比较方式可控
    if (arr.some(el => el !== arr[0])) {
      x()
    } else {
      y()
    }
  2. // 比较方式不可控,不支持对象比较,无论如何都会遍历完数组
    if (new Set(arr).size > 1) {
      x()
    } else {
      y()
    }
  3. // 比较方式可控,啰嗦但效率快
    for (var i = 1; i < arr.length; i += 1) {
      if (arr[i] !== arr[0]) {
        x()
        break
      }
    }
    if (i < arr.length) {
      y()
    }
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage