从Array.filter内部返回条件if

时间:2016-06-02 17:24:20

标签: javascript arrays

我试图从Array.filter方法中返回满足特定条件的项的索引,但我仍然得到一组实际值而不是索引我想要的价值观。

示例:

var seq = [3, 4, 1, 2, 1];

seq.filter((curr, index) => {
  if (seq[index + 1] < seq[index]) {
    return index;
  }
});

// returns [4, 2]
// want to return [1, 3] (the indexes of 4 & 2)

我可以使用更有效的方法吗?我试图避免使用for循环。感谢。

3 个答案:

答案 0 :(得分:3)

您可以在此使用reduce

&#13;
&#13;
var seq = [3, 4, 1, 2, 1];

var result = seq.reduce((ar, curr, index) => {
  if (seq[index + 1] < seq[index]) ar.push(index);
  return ar;
}, []);

console.log(result)
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以使用带有索引数组的过滤器和返回

的正确测试

&#13;
&#13;
var seq = [3, 4, 1, 2, 1],
    result = seq.map(function (_, i) { return i; }).filter(function (i) {
        return seq[i - 1] < seq[i];
    });

console.log(result);
&#13;
&#13;
&#13;

更好的解决方案是使用forEach

的循环

&#13;
&#13;
var seq = [3, 4, 1, 2, 1],
    result = [];

seq.forEach(function (a, i) {
    seq[i - 1] < a && this.push(i);
}, result);

console.log(result);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

在这种情况下使用for循环并不是一个坏主意。我个人认为它更清洁,更有效率。

let seq = [3, 4, 1, 2, 1];
for (let i = 0; i < seq.length; i++) {
  if (seq[i + 1] < seq[i]) {
    continue;
  }
  seq.splice(i, 1);
}