2017-10-28 58 views
0

我想知道是否有辦法將對象的鍵/值對分開並將它們插入到數組中,以便獲取對象數組。將對象鍵/值對拆分爲單獨的對象

下面是代碼:

let grades = [5,5,6,7,6,7,9,10,8,6] 

let gradesSpread = { 
    5:0, 
    6:0, 
    7:0, 
    8:0, 
    9:0, 
    10:0 
} 


// This populates spreadGrades object as intended 
for(let [index,grade] in grades.entries()) { 
    gradesSpread[grade]++ 
} 

所以現在我想從gradesSpread獲得鍵/值對併爲每個創建對象,並將其推入新的數組。

我知道我可以使用Object.values()Object.keys()擺脫對象鍵或值,但我不知道我怎麼會去添加這些鍵值對到對象

以便更好地觀察我需要陣列看的陣列是這樣的:

let finalSpread = [{5:0},{6:4}...] 

我向所有人開放的解決方案,也使得它,所以它不需要初始化的對象加分。

+0

那是哪裏來4 ?:形式'{6:4} ...]' – zer00ne

+0

這是一個例子,而不是在問題數據的反映。 – ukaric

+0

等級數組如何使用? – zer00ne

回答

1

聽起來好像要Array.prototype.reduce()

let grades = [5,5,6,7,6,7,9,10,8,6]; 

let finalSpread = grades.reduce((spread, grade) => { 
    let count = spread[grade] || 0; 
    spread[grade] = ++count; 
    return spread; 
}, {}); 

看到你想要的最終值本質上是一個地圖的鍵值,我建議finalSpread是像上面的對象。



更新:

如果是勢在必行這是什麼原因,你可以一個數組:

一個。

b。只需重構reduce中的函數以檢查[grade,count]數組是否已經存在,並添加或增加它。

c。使用Map而不是數組爲減少累加器(如果你需要的成績也爲數字 - 地圖允許非字符串鍵) - 然後將其轉換爲一個數組,即:

let finalSpread = grades.reduce((spread, grade) => { 
    let count = spread.get(grade) || 0; 
    spread.set(grade, ++count); 
    return spread; 
}, new Map()); 
finalSpread = Array.from(finalSpread); 

(注: mapArray.from()對瀏覽器的支持有限。)

+0

實際上使用'Map'作爲累加器的初始值非常出色。它解決了大量問題。 – ukaric

2
var arr = []; 
Object.keys(grades).forEach((key) => { 
    var newObj = {}; 
    newObj[key] = grades[key]; 
    arr.push(newObj); 
}); 

使用ES6它可以更短:

var arr = []; 
Object.keys(grades).forEach((key) => { 
    arr.push({[key]: grades[key}); 
}); 
+0

獲取鍵而不是對應鍵的值。 – ukaric

+0

o [鍵]是值,我將它改爲[等級[鍵[使其更清楚] – Nayish

1

您可以映射與價值觀的關鍵。該順序不反映對象的插入順序。

var object = { 5: 1, 6: 3, 2: 4 }, 
 
    result = Object 
 
     .keys(object) 
 
     .map(k => ({ [k]: object[k] })); 
 
    
 
console.log(result);

+0

我想知道爲什麼我不能在一個小時內映射對象一個小時,忘記了您可以映射數組而不是對象。感謝這是一個非常簡潔的解決方案,請問您如何按關鍵值對最終數組進行排序? – ukaric

+0

你需要哪個訂單? –

+0

無論是降序還是升序都很好。 – ukaric

0

你也可以嘗試:

let arrayOfObj = []; 
let extractPairs = (jsonObj) => { 
for(let item in jsonObj) { 
    console.log(item); 
    arrayOfObj.push({item: jsonObj[item]}) 
} 
console.log(arrayOfObj); 
}