JavaScript reduce中的返回三元运算符

JavaScript reduce中的返回三元运算符,javascript,arrays,indexof,reduce,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, val

我的数据结构如下:

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) {
    return prev.indexOf(curr.name) === -1 ? prev.push(curr.name) : prev;
}, []);
我使用此函数获取单个元素的数组:

example.reduce(function (prev, curr) {
    if (prev.indexOf(curr.name) === -1) prev.push(curr.name);
    return prev;
}, []);
虽然这样做有效,但我尝试使用三元运算符来提高可读性,如下所示:

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) {
    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)
未捕获类型错误:prev.indexOf不是函数
时间:3:13
at Array.reduce(本机)
两点九分
在Object.InjectedScript.\u evaluateOn(:895:140)
在Object.InjectedScript.\u evaluateAndWrap(:828:34)
在Object.InjectedScript.evaluate(:694:21)
这是为什么?

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

返回

方法所基于的对象的新长度属性 打电话来

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

如果你想继续使用三元运算符,你可以使用一个像

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

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

example.reduce(function (prev, curr) {
    return prev.indexOf(curr.name) < 0 && prev.push(curr.name), prev;
}, []);
示例.reduce(函数(上、当前){
返回prev.indexOf(curr.name)<0和prev.push(curr.name),prev;
}, []);
在这种情况下,我们不使用三元运算符,而是使用逻辑AND来测试
prev.indexOf(curr.name)<0
,如果是这样,我们就执行
prev.push(curr.name)
。但是,我们总是返回
prev
,因为


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

这是因为
push
函数不返回相同的数组。这是因为它不返回数组。它返回数组的新长度。您可以使您的解决方案不那么粗糙。请看我上面的答案。谢谢,虽然你的答案是有效的,而且我学到了更多关于逗号运算符的知识,但为了可读性,我更喜欢使用三元运算符。将尝试执行jsperf以查看哪一个性能最好,并将相应地进行选择。