2017-03-21 6 views
1

にプッシュ:Javascriptの反復配列、私は以下のコードを実装しようとしている各要素が表示された回数をカウントし、オブジェクト

var data = []; 
var devicesObj = {}; 
var devices = clients.map(function(k) { 
    return k.os; 
}); 

devices.sort(); 

var current = null; 
var cnt = 0; 

for (var i = 0; i <= devices.length; i++) { 
    if (devices[i] !== current) { 
     if (cnt > 0) { 
      devicesObj.label = current; 
      devicesObj.value = cnt; 
     } 
      data.push(devicesObj); 
      current = devices[i]; 
      cnt = 1; 
     } else { 
      cnt++; 
     } 

} 

アイデアは、デバイスの配列を反復処理しようとすることです各要素の名前を取得し、配列内で繰り返される回数を数えます。次に、現在の要素名をキーラベルの下のオブジェクトに割り当て、合計で値のキーをカウントします。最後に新しいオブジェクトを新しい配列にプッシュします。私は次のような結果を得るコードを実行した後

{ _id: 58d095c272b61889a6688922, 
    id: 'k65f508', 
    os: 'Apple iPhone', 
    mac: 'f0:24:75' }, 
{ _id: 58d095c272b61889a6688923, 
    id: 'k00e8fc', 
    os: 'Android', 
    mac: '08:ec:a9' }, 
{ _id: 58d095c272b61889a6688924, 
    id: 'k65f637', 
    os: 'Android', 
    mac: 'c0:bd:d1' }, 
{ _id: 58d095c272b61889a6688925, 
    id: 'k00b0ec', 
    os: 'Windows', 
    mac: '74:e2:8c' }, 
{ _id: 58d095c272b61889a6688926, 
    id: 'k00328a', 
    os: 'Android', 
    mac: 'd0:87:e2' }, 
{ _id: 58d095c272b61889a6688927, 
    id: 'k0006b1', 
    os: 'Apple iPhone', 
    mac: '9c:d3:5b' } 

デバイス変数にマップアレイの構造

[ 
    { 
    "label": "Apple iPhone", 
    "value": 2 
    }, 
    { 
    "label": "Apple iPhone", 
    "value": 2 
    }, 
    { 
    "label": "Apple iPhone", 
    "value": 2 
    }, 
    { 
    "label": "Apple iPhone", 
    "value": 2 
    }, 
    { 
    "label": "Apple iPhone", 
    "value": 2 
    }, 
    { 
    "label": "Apple iPhone", 
    "value": 2 
    } 
] 

を助けてください!

答えて

0

あなたは同じオブジェクトを何度も繰り返しています。試してみてください:

for (var i = 0; i < devices.length; i++) { 
    if (devices[i] !== current) { 
     if (cnt > 0) { 
      data.push({label: current, value: cnt}); 
     } 
     current = devices[i]; 
     cnt = 0; 
    } 
    cnt++; 
} 
if (cnt > 0) { 
    data.push({label: current, value: cnt}); 
} 
+0

はそれがない@JLRisheが、それはいけない:私<= devices.length iがdevices.lengthを<する必要があり、最後のデバイスを追加する必要があります。 –

+0

今よく見えます。 – JLRishe

-1

多くの問題があります。 1つは、同じオブジェクトを再利用していることです。そのため、同じ値を持つすべての配列要素を使用する必要があります。

ループのロジックに問題があり、データを構成できるすべての方法を正しく説明せず、値を配列に格納しない場合があります。

<を使用する必要がある場合は、ループ状態で<=を使用しています。

はこれを試してみてください:

var clients = getClients(); 
 

 
var devicesObj; 
 
var devices = clients.map(function(k) { 
 
    return k.os; 
 
}); 
 

 
devices.sort(); 
 
var current = null; 
 
var data = []; 
 

 
for (var i = 0; i < devices.length; i++) { 
 
    if (current !== devices[i]) { 
 
    current = devices[i]; 
 
    devicesObj = { label: current, value: 0 }; 
 
    data.push(devicesObj); 
 
    } 
 

 
    devicesObj.value += 1; 
 
} 
 

 
console.log(data); 
 

 
// sample clients data 
 
function getClients() { 
 
    return [{ 
 
    _id: '58d095c272b61889a6688922', 
 
    id: 'k65f508', 
 
    os: 'Apple iPhone', 
 
    mac: 'f0:24:75' 
 
    }, 
 
    { 
 
    _id: '58d095c272b61889a6688923', 
 
    id: 'k00e8fc', 
 
    os: 'Android', 
 
    mac: '08:ec:a9' 
 
    }, 
 
    { 
 
    _id: '58d095c272b61889a6688924', 
 
    id: 'k65f637', 
 
    os: 'Android', 
 
    mac: 'c0:bd:d1' 
 
    }, 
 
    { 
 
    _id: '58d095c272b61889a6688925', 
 
    id: 'k00b0ec', 
 
    os: 'Windows', 
 
    mac: '74:e2:8c' 
 
    }, 
 
    { 
 
    _id: '58d095c272b61889a6688926', 
 
    id: 'k00328a', 
 
    os: 'Android', 
 
    mac: 'd0:87:e2' 
 
    }, 
 
    { 
 
    _id: '58d095c272b61889a6688927', 
 
    id: 'k0006b1', 
 
    os: 'Apple iPhone', 
 
    mac: '9c:d3:5b' 
 
    } 
 
]; 
 
}

+0

downvoterは説明してくれませんか? – JLRishe

関連する問題