2016-08-01 102 views
0

對象數組我想用減少方法和映射得到這個結果如下:使用地圖和減少讓我在的</p> <pre><code>var c = [{name: 'John'}, {name: 'John'}, {name: 'Tom'}]; </code></pre> <p>數組

result = [ 
    { name: "John", occurence: 2 }, 
    { name: "Tom", occurence: 1 } 
    ] 

這裏是一個嘗試我已經嘗試,但仍然沒有完全得到它。 https://jsfiddle.net/joeSaad/up3ddfzz/

c = [{ 
 
    name: 'John' 
 
}, { 
 
    name: 'John' 
 
}, { 
 
    name: 'Simon' 
 
}]; 
 

 
var d = c.reduce((countMap, word) => { 
 
    countMap[word.name] = ++countMap[word.name] || 1; 
 
    return countMap 
 
}, []); 
 

 
var e = c.reduce((countMap, word) => { 
 
    q = []; 
 
    countMap[word.name] = ++countMap[word.name] || 1; 
 
    var p = { 
 
    name: word.name, 
 
    occurence: countMap[word.name] 
 
    } 
 
    q.push(p); 
 
    return q 
 
}, []); 
 

 
console.log(e);

幫助非常感謝。在此先感謝

+1

你忘了張貼的嘗試? – Li357

+0

@AndrewL。謝謝!只是編輯了問題 –

+0

@ mike-c似乎現在在我的jsfiddle中運行不起作用.. –

回答

3

你是絕對正確的軌道減少工作,但我的計算分成兩個不同的步驟

let c = [{name: 'John'}, {name: 'John'}, {name: 'Tom'}]; 
 

 
const pairs = o=> Object.keys(o).map(k=> [k, o[k]]) 
 

 
let count = c.reduce((acc, {name}) => { 
 
    if (acc[name] === undefined) 
 
    return Object.assign(acc, { [name]: 1 }) 
 
    else 
 
    return Object.assign(acc, { [name]: acc[name] + 1 }) 
 
}, {}) 
 

 
var result = pairs(count).map(([name, occurences]) => ({name, occurences})) 
 

 
console.log(result) 
 
//=> [ { name: 'John', occurences: 2 }, { name: 'Tom', occurences: 1 } ]


你可以抽象這些行爲進入不同的功能,像這樣

// convert an object to [[key,value]] pairs 
 
const pairs = o=> Object.keys(o).map(k=> [k, o[k]]) 
 

 
// count unique instances of a property value in an array of objects 
 
const countBy = (prop, xs)=> { 
 
    return xs.reduce((acc, x)=> { 
 
    let y = x[prop] 
 
    if (acc[y] === undefined) 
 
     return Object.assign(acc, { [y]: 1 }) 
 
    else 
 
     return Object.assign(acc, { [y]: acc[y] + 1 }) 
 
    }, {}) 
 
} 
 

 
// your data 
 
let c = [{name: 'John'}, {name: 'John'}, {name: 'Tom'}] 
 

 
// then chain it all together 
 
let result = pairs(countBy('name', c)).map(([name, occurences]) => ({name, occurences})) 
 

 
console.log(result) 
 
//=> [ { name: 'John', occurences: 2 }, { name: 'Tom', occurences: 1 } ]


ES6還提供Map這是做這種計算的相當不錯。

這段代碼對我來說有點更好,而且語義上更正確一點。我們以前的代碼做的是完全相同的事情,只是它使用了一個普通的對象。 Map是專門爲此key->value數據設計的數據結構,因此使Map成爲更好的選擇。

唯一的問題是,如果你的代碼庫還沒有以某種方式使用Google Maps,那麼僅僅爲此引入它們可能是錯誤的舉動。

// convert a Map to an array of pairs 
 
const mpairs = m=> [...m.entries()] 
 

 
// countBy this time uses Map 
 
const countBy = (prop, xs)=> { 
 
    return xs.reduce((m, x)=> { 
 
    let y = x[prop] 
 
    if (m.has(y)) 
 
     return m.set(y, m.get(y) + 1) 
 
    else 
 
     return m.set(y, 1) 
 
    }, new Map) 
 
} 
 

 
// your data 
 
let c = [{name: 'John'}, {name: 'John'}, {name: 'Tom'}] 
 

 
// then chain it all together 
 
let result = mpairs(countBy('name', c)).map(([name, occurences]) => ({name, occurences})) 
 

 
console.log(result) 
 
//=> [ { name: 'John', occurences: 2 }, { name: 'Tom', occurences: 1 } ]

+0

這絕對有效。感謝@naomik我仍然試圖理解爲什麼我們有const對。我們沒有使用它。另外我不安靜得到第二種方法。再次感謝! –

+0

我們絕對使用它'雙';仔細閱讀代碼。第二部分的意思是建議你將這些東西包裝在一個函數中,這樣它就不會混淆其餘的代碼。我在那裏添加了一些註釋,並且還添加了第三部分,它顯示瞭如何使用更多語義數據結構來執行相同的計算。 – naomik

相關問題