Я хочу преобразовать объект следующим образом:
{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
в массив пар ключ-значение, как это:
[[1,5],[2,7],[3,0],[4,0]...].
Как я могу преобразовать Объект в Массив пар ключ-значение в JavaScript?
javascript
arrays
type-conversion
Соптареану алексей
источник
источник
NaN
вместо этого вернется . Если вы хотите использовать строки как ключи, изменить возвращение из[Number(key), obj[key]]
к[key, obj[key]]
или использовать вObject.entries
качестве @Pila предложило в их ответеЛучший способ это сделать:
Вызов
entries
, как показано здесь, вернет[key, value]
пары, как просил аскер.В качестве альтернативы вы можете вызвать
Object.values(obj)
, который будет возвращать только значения.источник
В
Object.entries
функции возвращает почти точные результаты вы просите, за исключением клавиша являются строками вместо цифр.Если вам нужно, чтобы ключи были числами, вы можете отобразить результат в новый массив с функцией обратного вызова, которая заменяет ключ в каждой паре на число, полученное из него.
Я использую функцию стрелки и
Object.assign
для обратного вызова карты в приведенном выше примере, чтобы я мог сохранить ее в одной инструкции, используя тот факт, чтоObject.assign
возвращается объект, которому назначен объект, а возвращаемое значение функции стрелки одной инструкции является результатом инструкции.Это эквивалентно:
Как упомянуто @TravisClarke в комментариях, функцию карты можно сократить до:
Однако это создаст новый массив для каждой пары ключ-значение вместо изменения существующего массива на месте, что приведет к удвоению количества созданных пар ключ-значение. Хотя исходный массив записей по-прежнему доступен, он и его записи не будут собираться мусором.
Теперь, хотя при использовании нашего метода на месте все еще используются два массива, которые содержат пары ключ-значение (входной и выходной массивы), общее количество массивов изменяется только на один. Массивы ввода и вывода на самом деле не заполнены массивами, а скорее ссылками на массивы, и эти ссылки занимают незначительное место в памяти.
Вы можете сделать еще один шаг и полностью исключить рост, изменив массив записей на месте, а не сопоставляя его с новым массивом:
источник
Object.entries(obj).map(e => [+e[0], e[1]]);
Напомним, некоторые из этих ответов теперь на 2018 году, где ES6 является стандартом.
Начиная с объекта:
Этот последний метод также может реорганизовать порядок массива в зависимости от значения ключей. Иногда это может быть желаемое поведение (иногда нет). Но теперь преимущество заключается в том, что значения индексируются в правильном слоте массива, что очень важно и просто для поиска в нем.
Наконец (не часть исходного вопроса, но для полноты), если вам нужно легко искать, используя ключ или значение, но вы не хотите разреженных массивов, дубликатов и переупорядочения без необходимости преобразования в числовые ключи ( даже может получить доступ к очень сложным ключам), тогда массив (или объект) - это не то, что вам нужно. Я буду рекомендовать
Map
вместо этого:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
источник
Еще одно решение, если у
Object.entries
вас не получится.источник
В Ecmascript 6,
играть на скрипке
источник
.map((value)=>(value))
часть не имеет смысла - она просто возвращает массив записей, точно эквивалентный массиву, полученному приObject.entries(obj)
вызове.Использование
Object.keys
иArray#map
методы.источник
Используйте
Object.entries
для получения каждого элемента объекта вkey & value
формате, а затемmap
через них, как это:Но, если вы уверены, что ключи будут в прогрессивном порядке, вы можете использовать
Object.values
иArray#map
сделать что-то вроде этого:источник
Если вы используете lodash, это может быть так просто:
источник
С lodash, в дополнение к ответу, приведенному выше, вы также можете иметь ключ в массиве вывода.
Без ключей объекта в выходном массиве
для:
Если obj следующее:
Тогда массив будет:
С ключами объекта в выходном массиве
Если вы пишете вместо этого («жанр» - строка, которую вы выбираете):
Ты получишь:
источник
Я бы предложил это простейшее решение для использования
Object.entries()
источник
Вы можете использовать
Object.values([])
, вам может понадобиться этот polyfill, если вы этого еще не сделали:https://stackoverflow.com/a/54822153/846348
Тогда вы можете просто сделать:
Просто помните, что массивы в js могут использовать только числовые ключи, поэтому, если вы использовали что-то еще в объекте, они станут `0,1,2 ... x``
Это может быть полезно для удаления дубликатов, например, если у вас есть уникальный ключ.
источник
Использовать для в
источник
Рекурсивное преобразование объекта в массив
источник
Мы можем изменить Number на String type для Key, как показано ниже:
источник
источник
Это моя простая реализация barebone:
источник
Простое решение
`
источник
Вы можете использовать _.castArray (obj) .
пример:
_.castArray({ 'a': 1 }); // => [{ 'a': 1 }]
источник