簡體   English   中英

在JavaScript中返回三元運算符reduce

[英]Return ternary operator in JavaScript 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)

這是為什么?

這是因為調用.push()將返回數組的新長度,該長度是一個數字,因此第二個調用prev將是一個沒有push方法的number(1)。

返回

調用該方法的對象的新length屬性。

因此,使用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;
}, []);

在這種情況下,我們不是使用三元運算符,而是使用邏輯AND來測試prev.indexOf(curr.name) < 0 ,如果是,那么我們進行prev.push(curr.name) 但是,由於逗號運算符 ,我們總是返回prev

正如我在評論中提到的那樣,您的代碼不起作用,因為.push不返回原始數組。 它返回數組的新長度。 您可以將.push替換為.concat但是效率很低。 我上面描述的方法更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM