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

时间:2019-05-07 03:30:47

标签: javascript ternary-operator arrow-functions

我正在尝试编写 reduce 语句,该语句给定字符串数组,返回包含单词'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

2 个答案:

答案 0 :(得分:3)

它不起作用的主要原因是因为在这两种情况下,您的三元运算都返回一个数字。 .push()返回数组的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数组的keys

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

console.log(output)

答案 1 :(得分:2)

在reduce语句中,如果indexOf <0,则返回0而不是数组,请尝试

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);