2017-02-27 89 views
2

採取出售的商品,我們奇怪的是隻有感興趣的項目名稱和值的虛擬排列:的JavaScript/ES6找到獨特的元素和陣列盡數

let items = [ 
    { title: "Trumping the Horns", value: 5.95 }, 
    { title: "Rocking about", value: 20.00 }, 
    { title: "Trumping the Horns", value: 5.95 } 
] 

我知道我可以得到一個數組獨特的價值相當容易:

const uniqueSales = [...new Set(items.map(item => item.title))]; 

但讓我們例如說,我想知道每件物品有多少我賣了,或他們的累計價值?所以:

[ 
    { title: "Trumping the Horns", amount: 2 }, 
    { title: "Rocking about", amount: 1 } 
] 

是否有可能映射這些,而不必做一些瘋狂的排序和遍歷該數組?優先考慮單線。不做服務器端的主要原因是我對相同數據有相當多的不同操作,發送一次並讓客戶端處理數據的操作和演示似乎是最正確的。

回答

2

您可以使用Map並存儲對結果數組的新插入對象的引用。

var items = [{ title: "Trumping the Horns", value: 5.95 }, { title: "Rocking about", value: 20.00 }, { title: "Trumping the Horns", value: 5.95 }], 
 
    result = items.reduce(
 
     (map => (r, a) => (!map.has(a.title) && map.set(a.title, r[r.push({ title: a.title, amount: 0 }) - 1]), map.get(a.title).amount++, r))(new Map), 
 
     [] 
 
    ); 
 

 
console.log(result)

+0

美麗 - tyvm。 – Dennis

0

我會使用地圖而不是數組來存儲您的物品,其中地圖的鍵應該是物品的標題,並且該值應該是已售物品的數量。每次在向地圖添加新項目之前,您都應該檢查密鑰是否已經存在,如果存在,則增加數量,否則將新的鍵值對添加到地圖中。

1

let items = [{ 
 
    title: "Trumping the Horns", 
 
    value: 5.95 
 
    }, 
 
    { 
 
    title: "Rocking about", 
 
    value: 20.00 
 
    }, 
 
    { 
 
    title: "Trumping the Horns", 
 
    value: 5.95 
 
    } 
 
]; 
 

 
console.log(items.reduce(function(countMap, item) { 
 
    countMap[item.title] = ++countMap[item.title] || 1; 
 
    return countMap; 
 
}, {}));

+0

這不會產生OP說他想要的輸出。 –

1

鑑於你到底想要的格式,我不認爲它會比使用Map建立與對象更短titleamount,然後抓住Map的值:

const items = [ 
 
    { title: "Trumping the Horns", value: 5.95 }, 
 
    { title: "Rocking about", value: 20.00 }, 
 
    { title: "Trumping the Horns", value: 5.95 } 
 
]; 
 
const map = new Map(); 
 
items.forEach(item => { 
 
    const entry = map.get(item.title); 
 
    if (!entry) { 
 
    map.set(item.title, {title: item.title, amount: 1}); 
 
    } else { 
 
    ++entry.amount; 
 
    } 
 
}); 
 
const uniqueSales = [...map.values()]; 
 
console.log(uniqueSales);

...優選一個班輪...

上述可硬塞進更少的行,但它並不能提高速度,可讀性,或可維護性。恰恰相反。

+1

完全同意一行。可能是一個糟糕的選擇,我的觀點主要是儘可能簡潔,只有最少的步驟和最合理的步驟。 – Dennis

+0

@丹尼斯:值得注意的是,妮娜的解決方案比上述(不必要的關鍵字查找)效率低,純粹是因爲她可以將它用於表達而不是陳述。現在,99.9999%的時間你不關心,但它是一個例子,說明如何更少的語句!=最有效的,最少的步驟解決方案。 –

0
let array = [{title:"123"}, {title: "234"}, {title: "123"}] 
let sum = array.reduce((results, item, index) => { 
         let totalItem = results.find((element) => 
          element.title == item.title) 
         if(totalItem){ 
         totalItem.count += 1 
         }else { 
         results.push(Object.assign(item, { 
           count: 1 
          })) 
         } 
         return results 
        }, []) 

使用數組減少產生新的陣列