将对象键/值对拆分为单独的对象

时间:2017-10-28 18:40:54

标签: javascript arrays ecmascript-6

我想知道有没有办法分割对象的键/值对并将它们插入到数组中,以便获得对象数组。

以下是代码:

gradesSpread

所以现在我想从Object.values()获取键/值对并为每个创建对象并将其推入新数组。

我知道我可以使用Object.keys()let finalSpread = [{5:0},{6:4}...] 从对象获取键或值,但我不知道如何将这些键值对添加到对象数组中

为了更好的可视化,我需要数组看起来像这样:

{{1}}

我对所有解决方案都持开放态度,因此它不需要初始化对象。

4 个答案:

答案 0 :(得分:3)

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});
});

答案 1 :(得分:2)

您可以使用值映射键。订单不反映对象的插入顺序。



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




答案 2 :(得分: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作为上面的对象。

<强>更新

如果它是命令式,无论出于何种原因,它都是一个数组:

一个。在末尾添加finalSpread = Object.entries(finalSpread) (注意:每个成绩实际上都是一个字符串)

湾只需重构reduce中的函数来检查它们的[grade,count]数组是否已经存在,并添加或递增它。

℃。使用Map而不是数组作为reduce accumulator(如果你需要等级也是数字 - 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()的浏览器支持有限。)

答案 3 :(得分:0)

您也可以尝试:

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