Создайте пару ключ-значение как для текущего ключа, так и для значения

В настоящее время у меня есть массив простых объектов:

data = [{ "alternative hip hop": 3 }, { "escape room": 4 }, ...]

... в который я хотел бы превратить

newData = [
    { "name": "alternative hip hop", "count": 3 },
    { "name": "escape room", "count" 4 }
]

Это возможно с картой? Я не смог понять, как это сделать с одним.

lodash ответы также приветствуются


person DeLaFields    schedule 13.11.2017    source источник
comment
Можете ли вы гарантировать, что каждый объект в исходном массиве данных будет иметь только одну пару ключ-значение?   -  person Jabari Dash    schedule 14.11.2017
comment
Ага! Только один ключ-значение для каждого объекта   -  person DeLaFields    schedule 14.11.2017
comment
Я скажу, ваша структура для data немного странная. Возможно, стоит посмотреть, можно ли вообще избежать такой структуры данных.   -  person Retsam    schedule 14.11.2017
comment
Согласовано. Это просто временный держатель для некоторого json, который мне нужно было преобразовать.   -  person DeLaFields    schedule 14.11.2017


Ответы (3)


Предполагая, что каждый элемент данных имеет одну пару ключ / значение, вам нужно:

data.map(obj => {
    const key = Object.keys(obj)[0]; //Just get the first key we find
    return {
        name: key,
        count: obj[key]
    };
})
person Retsam    schedule 13.11.2017
comment
Меня всегда поражает, насколько проста эта проблема для более опытных разработчиков. Как будто я мог бы найти решение, но на это у меня ушло бы как минимум полчаса экспериментов. - person Joseph Cho; 14.11.2017
comment
Именно то, что я искал, спасибо! В своих попытках я пропустил добавление [0] в Object.keys. - person DeLaFields; 14.11.2017

Надеюсь, я не написал ложь на своем мобильном телефоне, но вот способ:

let newData = data.map(e => {
    for(let key in e) {
       return { 
           name: key,
           count: e[key]
       };
    }
});
person Nikolaus    schedule 13.11.2017
comment
Я исправил отступы, добавил немного пробелов, похоже, это тоже сработает. - person Retsam; 14.11.2017

Я не знаком с loadsh, но с javascript вы можете сделать следующее:

var data = [{ "alternative hip hop": 3 }, { "escape room": 4 }]
var newData = [];

data.forEach((item)=>{ //loop over the array
  Object.keys(item) //get the object keys
    .map((keyName)=>{  //loop over each key
        newData.push({name:keyName, count:item[keyName]}) //insert it into the new array
     })
})
console.log(newData)
person Frankusky    schedule 13.11.2017