2016-08-01 9 views
0

オブジェクトの配列を取得します試してみましたが、それでも完全には得られません。 https://jsfiddle.net/joeSaad/up3ddfzz/マップを使用し、削減は、私はこの次の結果を得るための方法を減らす使用してマッピングしたい私は</p> <pre><code>var c = [{name: 'John'}, {name: 'John'}, {name: 'Tom'}]; </code></pre> <p>の配列を抱えている

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

のおかげであなたは削減での作業右のトラックに間違いだが、私は2つの異なる段階

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をより良い選択にします。

唯一の問題は、コードベースで何らかの方法でマップが使用されていない場合に、これを導入することが間違っている可能性があることです。

// 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 pairがある理由を理解しようとしています。私たちはそれを使用していません。また、私は静かではない2番目のアプローチを取得します。再度、感謝します! –

+0

私たちは間違いなく 'pair'を使用しています。コードをもっと詳しく読んでください。 2番目のセクションは、コードを残りの部分を乱雑にしないように、関数内でこの要素をラップすることを提案しています。そこにいくつかのノートを追加し、より意味のあるデータ構造を使用して同じ計算を行う方法を示す第3のセクションを追加しました。 – naomik

関連する問題

 関連する問題