2017-08-07 28 views
0

我有一個數組在陣列組的多個元素使用JavaScript

[ 
    { price: 10 }, 
    { price: 10 }, 
    { price: 10 }, 
    { price: 10 }, 
    { price: 20 }, 
    { price: 20 }, 
] 

,我希望它轉化爲

[ 
    { numElements: 4, price: 10 }, 
    { numElements: 2, price: 20 }, 
] 

我一直在使用arr.reduce((prev, curr) => ..., [])來完成這個試過,但我想不出怎麼做。

+0

你能顯示出與減少的嘗試?使用這是一個非常好的開始(不是居高臨下)。 – evolutionxbox

回答

0

的傳統方法可能會使用for/loop纏鬥中的數據,但這些天的JavaScript有很多功能的方法,可以幫助。此代碼使用reducemap。要以您想要的格式獲取數據是兩個階段的過程。

首先,使用reduce創建使用價格哈希表的鍵(因爲你知道每個價格將是獨一無二的:因爲它的立場

const obj = arr.reduce((p, c) => { 

    // If price exists as a key its value by 1 
    // otherwise set it to 1. 
    p[c.price] = ++p[c.price] || 1; 
    return p; 
}, {}); 

輸出

{ 
    "10": 4, 
    "20": 2 
} 

你有一個完美的物體,你可以訪問的關鍵/價格,我可能會停在那裏:

obj['10'] // 4 

但是,如果要將數據轉換爲問題的格式,請使用map來覆蓋對象鍵以返回新對象的數組。

const out = Object.keys(obj).map(key => { 
    return { price: +key, numElements: obj[key] }; 
}); 

DEMO

0
var hash = {}, result = []; 

arr.forEach(function(el){ 
    if(hash[el.price]){ 
    hash[el.price].numElements++; 
    }else{ 
    result.push(hash[el.price]={price:el.price,numElements:1}); 
    } 
}); 

Run

可以使用哈希表的價格查詢。或減少和發現:

arr.reduce((res,{price})=> 
    ((res.find(el=>el.price===price) || res[res.push({price,numElements:0})-1]) 
    .numElements++,res) 
); 

Run

0

您可以使用試試這個:

let arr = [ 
    { price: 10 }, 
    { price: 10 }, 
    { price: 10 }, 
    { price: 10 }, 
    { price: 20 }, 
    { price: 20 }, 
] 

let result = [] 

let counter = {} 

arr.forEach(el => { 

    if (!counter[el.price]) counter[el.price] = 1 
    else counter[el.price]++ 

    console.log(counter[el.price]) 

}) 

for (let id in counter) { 
    result.push({numElements: counter[id], price: id}) 
} 
0

假設數據來自上排序price財產,有一個.reduce()你可以做如下:

var data = [{ price: 10 }, { price: 10 }, { price: 10 }, { price: 10 }, { price: 20 }, { price: 20 }], 
 
    result = data.reduce((r,d,i) => i ? r[r.length-1].price === d.price ? (r[r.length-1].numElemenets++, r) 
 
                     : (r.push(Object.assign({}, d, {numElemenets: 1})),r) 
 
             : [Object.assign({}, d, {numElemenets: 1})], {}); 
 
console.log(result);

0

你可以看看了價格,結果數組中,如果沒有找到插入一個新的對象。

var data = [{ price: 10 }, { price: 10 }, { price: 10 }, { price: 10 }, { price: 20 }, { price: 20 }], 
 
    grouped = data.reduce((r, { price }) => { 
 
     var t = r.find(p => price === p.price); 
 
     t || r.push(t = { numElements: 0, price }); 
 
     t.numElements++; 
 
     return r; 
 
    }, []); 
 
    
 
console.log(grouped);