2017-10-28 141 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); 
}