2016-10-11 6 views
2

JSONフィードからデータを抽出していて、各名前(name_class)が発生する回数を数えようとしています。Javascript/ES2015、発生数をカウントして配列内のオブジェクトとして格納する

私はカウントは名前が表示された回数を指し、次の形式で、オブジェクトの配列を返すようにしたい:

myArray = [{name:"John", count: 5}, {name: "Sarah", count: 2}, {name: "Oliver", count: 3}]; 

は、これまでのところ、私は次のことを持っているが、これは数をカウントしていません単に配列に別のオブジェクトを追加するだけです。

let namestUi = { 
    renderNames(names){ 
     var counter2 = []; 
     let namesFound = names.map((name) => { 
      let {name_class} = name; 

      if(counter2.name == name_class){ 
       counter2.count++; 
      } else { counter2.push({name: name_class, count: 1}); } 
     }); 
     console.log(counter2); 
     return namesFound; 
     } 
    }; 

これは、オブジェクトの配列を構築していますが、発生数はカウントしていません。

+0

カウンタ2があります配列...名前プロパティ – epascarello

+0

を参照しています。 'counter2.count ++'この行は奇妙です。 –

答えて

1
function count(names){ 
    // Count occurrences using a map (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) 
    let map = new Map(); 
    for (let name of names) { 
     map.set(name, (map.get(name) || 0) + 1); 
    } 

    // Transform to array of { name, count } 
    let result = []; 
    for (let [name, count] of map) { 
     result.push({name: name, count: count}); 
    } 

    return result; 
} 

count(["a", "b", "c", "a", "b", "a"]) 
// [{"name":"a","count":3},{"name":"b","count":2},{"name":"c","count":1}] 
0

カウンタ変数の使用方法にはいくつかの問題があります。プロパティは、単純なオブジェクトであるかのようにプロパティにアクセスしますが、配列として定義します。また、mapコールバック関数は値を返していません。あなたが要求したとして

あなたは、オブジェクトの配列にマップを変換するために、名前でキーカウンターにMapを使用し、次にArray.fromを適用し、このコードを使用することができます。

let namestUi = { 
 
    renderNames(names){ 
 
     return Array.from(
 
      names.reduce((counters, {name_class}) => 
 
       counters.set(name_class, (counters.get(name_class) || 0) + 1), 
 
       new Map()), 
 
      ([name, count]) => ({name, count}) 
 
     ); 
 
    } 
 
}; 
 

 
let result = namestUi.renderNames([ 
 
    { name_class: "John" }, 
 
    { name_class: "John" }, 
 
    { name_class: "Frank" }, 
 
    { name_class: "John" }, 
 
]); 
 

 
console.log(result);

関連する問題