2017-07-06 20 views
1

私は、文字列の配列を持っている:私はから重複を削除したい、その後、私はそれを変換したいオブジェクトの配列に変換し、配列から重複を削除し、追加重複カウントプロパティ

var array = ['bob', 'charlie', 'bob', 'bob']; 

重複カウントプロパティを追加しながらオブジェクトの配列。

これは私が達成したいものです。

var filteredData = [{ name: 'bob', count: 3}, { name: 'charlie', count: 1}]; 

はどのように私はそれを行うことができますか?

+0

の可能性のある重複した[JavaScriptを配列に一致する値をカウントする方法](https://stackoverflow.com/questions/2228362/how-to-count-matching-values-in-array -of-javascript) –

+0

正確な複製はありませんが、回答は少し修正されたバージョンの回答になります –

答えて

3

Ecmascript5Array.prototype.reduce()関数を使用して溶液(Object.values()機能付き)

var arr = ['bob', 'charlie', 'bob', 'bob'], 
 
    counts = arr.reduce(function(r,s){ 
 
     (!r[s])? r[s] = {name: s, count: 1} : r[s]['count']+=1; 
 
     return r; 
 
    }, {}), 
 
    result = Object.keys(counts).map(function(k){ return counts[k]; }); 
 
    
 
console.log(result);


Ecmascript6バージョン:

Array#reduceMapを使用して

var arr = ['bob', 'charlie', 'bob', 'bob'], 
 
    result = Object.values(arr.reduce((r,s) => { 
 
     (!r[s])? r[s] = {name: s, count: 1} : r[s]['count']+=1; 
 
     return r; 
 
    }, {})); 
 
    
 
console.log(result);

0

:ここ

const array = ['bob', 'charlie', 'bob', 'bob']; 
 

 
const result = [...array.reduce((map, name) => { 
 
    const current = map.get(name) || { name, count: 0 }; 
 
    
 
    current.count++; 
 

 
    return map.set(name, current); 
 
}, new Map()).values()]; 
 

 
console.log(result);

0

Array.prototype.reduceのいくつかの簡単な使い方です:

const data = ['bob', 'charlie', 'bob', 'bob'] 
 

 
const result = data.reduce(function(prev, curr) { 
 
    const index = prev.findIndex(el => el.name === curr) 
 

 
    if (index !== -1) { 
 
    prev[index].count += 1 
 
    } else { 
 
    prev.push({ name: curr, count: 1 }) 
 
    } 
 

 
    return prev 
 
}, []) 
 

 
console.log(result)

関連する問題