在JavaScript中返回三元运算符减少

时间:2015-06-09 03:56:12

标签: javascript arrays indexof reduce

我有这样的数据结构:

var example = [
    { name: "item1", year: 2013, value: 100 },
    { name: "item1", year: 2012, value:  97 },
    { name: "item3", year: 2013, value:  93 },
    { name: "item3", year: 2012, value:  91 },
    { name: "item2", year: 2012, value:  -6 },
    { name: "item2", year: 2011, value:  -5 },
    { name: "item4", year: 2012, value: -36 },
    { name: "item3", year: 2011, value:  93 },
    { name: "item4", year: 2013, value: -35 },
    { name: "item1", year: 2011, value:  98 },
    { name: "item2", year: 2013, value:  -7 },
    { name: "item4", year: 2011, value: -37 },
    { name: "item5", year: 2013, value:  58 },
    { name: "item5", year: 2012, value:  55 },
    { name: "item5", year: 2011, value:  54 }
];

我正在使用此函数来获取单个元素的数组:

example.reduce(function (prev, curr) {
    if (prev.indexOf(curr.name) === -1) prev.push(curr.name);
    return prev;
}, []);

虽然这有效,但我尝试使用三元运算符来实现这样的可读性:

example.reduce(function (prev, curr) {
    return prev.indexOf(curr.name) === -1 ? prev.push(curr.name) : prev;
}, []);

我在Chrome中遇到以下错误:

Uncaught TypeError: prev.indexOf is not a function
    at <anonymous>:3:13
    at Array.reduce (native)
    at <anonymous>:2:9
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)

为什么?

2 个答案:

答案 0 :(得分:3)

这是因为调用.push()将返回数组的新长度,这是一个数字,所以第二个调用prev将是一个没有push方法的数字(1)。

  

返回

     

方法所针对的对象的新长度属性   调用。

因此,在您的情况下使用if条件会更好。

如果您仍想使用三元运算符,可以使用像

这样的hacky解决方案
var b = example.reduce(function (prev, curr) {
    return prev.indexOf(curr['name']) === -1 ? prev.push(curr['name']) && prev : prev;
}, []);

答案 1 :(得分:1)

将您的三元运算符替换为&&,,而不是?:,如下所示:

example.reduce(function (prev, curr) {
    return prev.indexOf(curr.name) < 0 && prev.push(curr.name), prev;
}, []);

在这种情况下,我们使用逻辑AND来测试是否prev.indexOf(curr.name) < 0而不是使用三元运算符,如果是,那么我们会prev.push(curr.name)。但是,由于comma operator,我们总是返回prev

正如我在评论中提到的,您的代码不起作用,因为.push没有返回原始数组。它返回数组的新长度。您可以将.push替换为.concat,但这样效率会非常低。我上面描述的方法更好。