reduce 语句中的单行 if 语句不起作用

Single line if statement in reduce statement not working

我正在尝试编写一个 reduce 语句,给定一个字符串数组,return 包含单词 'lace' 的数组索引。

我让它可以使用多行 if 语句,但是当我使用单行 if 语句时它不起作用:

输入数组

arr = [ 'tasselled', 'black', 'low-top', 'lace-up' ]

预期输出

[3] // since the string 'lace' is in the 3rd index of the array

我的代码

// works (multi-line if statement)
arr.reduce( function(a,e,i) {
    if (e.indexOf('lace') >= 0) {
      a.push(i)
    }
    return a
  }, [])

// returns [3]
// doesn't work (single-line if statement)
arr.reduce( (a,e,i) => e.indexOf('lace')>=0 ? a.push(i) : 0, []);

// side note - can you do single-line if-statements without the else statement? (without the ': 0')

// returns error:
TypeError: a.push is not a function

在你的 reduce 语句中,如果 indexOf <0 那么你 return 0 而不是数组,try

arr = [ 'tasselled', 'black', 'low-top', 'lace-up' ];

let r=arr.reduce( (a,e,i) => (e.indexOf('lace')>=0 ? a.push(i) : 0, a), []);

console.log(r);

它不起作用的主要原因是因为您的三元运算 returns 在两种情况下都是一个数字。 .push() returns 数组的 length 而不是数组本身。

因此您可以将其更改为使用 concat:

const arr = [ 'tasselled', 'black', 'low-top', 'lace-up' ]
const output = arr.reduce((a,e,i) => e.includes('lace') ? a.concat(i) : a, []);

console.log(output)

另一种选择是filter the keys的数组

const arr = [ 'tasselled', 'black', 'low-top', 'lace-up' ]
const output = [...arr.keys()].filter(i => arr[i].includes('lace'))

console.log(output)