我正在尝试编写 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
答案 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)
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);