- How to convert an Object <> to an Array [] of key-value pairs in JavaScript
- Как Преобразовать Объект в Массив (JS)
- Преобразование объекта в массив
- 1. С помощью цикла
- 2. Преобразование объекта в массив с помощью методов Object.keys и Object.values
- 3. Преобразование объекта в массив с помощью метода Object.entries
- 4. Деструктуризация объекта
- Как преобразовать массив в объект
- Статьи из данной категории:
- Object.values()
- Интерактивный пример
- Синтаксис
- Параметры
- Возвращаемое значение
- Описание
- Примеры
- Полифил
- Спецификации
- Совместимость с браузерами
- Смотрите также
- Found a content problem with this page?
- Object.keys, values, entries
- Object.keys, values, entries
- Трансформации объекта
- Задачи
- Сумма свойств объекта
How to convert an Object <> to an Array [] of key-value pairs in JavaScript
@blvckasvp Are you using numbers as your keys? If not, when it tries to convert your key to a number it will fail and return NaN instead. If you want to use strings as your keys, change the return from [Number(key), objJavascript массив значений объекта] to Javascript массив значений объекта] or use the Object.entries as @Pila suggested in their answer
var obj = var result = Object.entries(obj); console.log(result);
Calling entries , as shown here, will return Javascript массив значений объекта pairs, as the caller requested.
Alternatively, you could call Object.values(obj) , which would return only values.
Object.entries() returns an array whose elements are arrays corresponding to the enumerable property Javascript массив значений объекта pairs found directly upon object . The ordering of the properties is the same as that given by looping over the property values of the object manually.
— https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description
The Object.entries function returns almost the exact output you’re asking for, except the keys are strings instead of numbers.
const obj = ; console.log(Object.entries(obj));
If you need the keys to be numbers, you could map the result to a new array with a callback function that replaces the key in each pair with a number coerced from it.
const obj = ; const toNumericPairs = input => < const entries = Object.entries(input); return entries.map(entry =>Object.assign(entry, < 0: +entry[0] >)); > console.log(toNumericPairs(obj));
I use an arrow function and Object.assign for the map callback in the example above so that I can keep it in one instruction by leveraging the fact that Object.assign returns the object being assigned to, and a single instruction arrow function’s return value is the result of the instruction.
As mentioned by @TravisClarke in the comments, the map function could be shortened to:
However, that would create a new array for each key-value pair, instead of modifying the existing array in place, hence doubling the amount of key-value pair arrays created. While the original entries array is still accessible, it and its entries will not be garbage collected.
Now, even though using our in-place method still uses two arrays that hold the key-value pairs (the input and the output arrays), the total number of arrays only changes by one. The input and output arrays aren’t actually filled with arrays, but rather references to arrays and those references take up a negligible amount of space in memory.
- Modifying each key-value pair in-place results in a negligible amount of memory growth, but requires typing a few more characters.
- Creating a new array for each key-value pair results in doubling the amount of memory required, but requires typing a few less characters.
You could go one step further and eliminate growth altogether by modifying the entries array in-place instead of mapping it to a new array:
const obj = ; const toNumericPairs = input => < const entries = Object.entries(obj); entries.forEach(entry =>entry[0] = +entry[0]); return entries; > console.log(toNumericPairs(obj));
Как Преобразовать Объект в Массив (JS)
Рассмотрим 4 способа, как преобразовать объект в массив при помощи JavaScript. Затем преобразуем массив в объект.
Преобразование объекта в массив
Исходные данные. Пусть у нас есть объект (object).
Нам необходимо преобразовать его в массив (array). Рассмотрим 4 способа.
1. С помощью цикла
Преобразуем объект в массив, используя цикл for . Данный способ использовался ранее, до ES6.
const countries = []; for (let population in populations) < if (populations.hasOwnProperty(population)) < countries.push(population) >>
2. Преобразование объекта в массив с помощью методов Object.keys и Object.values
Данный способ включает в себя ES6 и ES8 синтаксис.
// ключи объекта преобразуем в массив (ES6) Object.keys(populations); // значения объекта преобразуем в массив (ES8) Object.values(populations);
Object.values не поддерживает IE. Polyfill Object.values.
3. Преобразование объекта в массив с помощью метода Object.entries
Для преобразования объекта в массив будем использовать метод Object.entries , который позволяет извлечь и ключи и значения в один массив.
Object.entries не поддерживает IE. Polyfill Object.entries.
4. Деструктуризация объекта
Результатом предыдущего способа были вложенные массивы.
Деструктуризирующее присваивание позволяет извлекать несколько значений из объекта/массива в отдельные переменные.
Только посмотрите что можно получить, используя деструктуризацию.
const abjArr = Object.entries(populations); abjArr.forEach((Javascript массив значений объекта) => < console.table(key, value); >);
for (let Javascript массив значений объекта of Object.entries(populations)) < console.log(`$:$`); >
Как преобразовать массив в объект
Чтобы преобразовать массив в объект необходимо использовать метод Object.fromEntries.
Поддержка большинства браузеров, но не всех — MDN: Object.fromEntries.
const populations = [ ["russia", 146780], ["ukraine", 42153], ["belarus", 9475] ]; Object.fromEntries(populations);
Сегодня мы рассмотрели различные способы, как преобразовать объект в массив, и обратно (массив в объект).
Надеюсь, вам понравилась данная информация. Если вам интересна тема web-разработки, то можете следить за выходом новых статей в Telegram.
Статьи из данной категории:
Object.values()
Метод Object.values() возвращает массив значений перечисляемых свойств объекта в том же порядке что и цикл for. in . Разница между циклом и методом в том, что цикл перечисляет свойства и из цепочки прототипов.
Интерактивный пример
Синтаксис
Параметры
Объект, чьи значения перечисляемых свойств будут возвращены.
Возвращаемое значение
Массив содержащий значения перечисляемых свойств объекта.
Описание
Object.values() возвращает массив, чьи элементы это значения перечисляемых свойств найденных в объекте. Порядок такой же как если пройтись по объекту циклом вручную.
Примеры
var obj = foo: "bar", baz: 42 >; console.log(Object.values(obj)); // ['bar', 42] // Массив как объект var obj = 0: 'a', 1: 'b', 2: 'c' >; console.log(Object.values(obj)); // ['a', 'b', 'c'] // Массив как объект со случайным порядком ключей // Когда мы используем нумерованные ключ, значения возвращаются в порядке возрастания var an_obj = 100: 'a', 2: 'b', 7: 'c' >; console.log(Object.values(an_obj)); // ['b', 'c', 'a'] // getFoo неперечисляемое свойство var my_obj = Object.create(>, getFoo: value: function() return this.foo; > > >); my_obj.foo = "bar"; console.log(Object.values(my_obj)); // ['bar'] // Аргумент, не являющийся объектом, будет приведён к объекту console.log(Object.values("foo")); // ['f', 'o', 'o']
Полифил
Для добавления совместимости Object.values со старым окружением, которое не поддерживает нативно его, вы можете найти полифил здесь tc39/proposal-object-values-entries или в es-shims/Object.values репозитории.
Спецификации
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
This page was last modified on 7 нояб. 2022 г. by MDN contributors.
Your blueprint for a better internet.
Object.keys, values, entries
Давайте отойдём от отдельных структур данных и поговорим об их переборе вообще.
В предыдущей главе мы видели методы map.keys() , map.values() , map.entries() .
Это универсальные методы, и существует общее соглашение использовать их для структур данных. Если бы мы делали собственную структуру данных, нам также следовало бы их реализовать.
Методы поддерживаются для структур:
Простые объекты также можно перебирать похожими методами, но синтаксис немного отличается.
Object.keys, values, entries
Для простых объектов доступны следующие методы:
- Object.keys(obj) – возвращает массив ключей.
- Object.values(obj) – возвращает массив значений.
- Object.entries(obj) – возвращает массив пар [ключ, значение] .
Обратите внимание на различия (по сравнению с map , например):
Map | Object | |
---|---|---|
Синтаксис вызова | map.keys() | Object.keys(obj) , не obj.keys() |
Возвращает | перебираемый объект | «реальный» массив |
Первое отличие в том, что мы должны вызвать Object.keys(obj) , а не obj.keys() .
Почему так? Основная причина – гибкость. Помните, что объекты являются основой всех сложных структур в JavaScript. У нас может быть объект data , который реализует свой собственный метод data.values() . И мы всё ещё можем применять к нему стандартный метод Object.values(data) .
Второе отличие в том, что методы вида Object.* возвращают «реальные» массивы, а не просто итерируемые объекты. Это в основном по историческим причинам.
- Object.keys(user) = [«name», «age»]
- Object.values(user) = [«John», 30]
- Object.entries(user) = [ [«name»,»John»], [«age»,30] ]
Вот пример использования Object.values для перебора значений свойств в цикле:
let user = < name: "John", age: 30 >; // перебор значений for (let value of Object.values(user)) < alert(value); // John, затем 30 >
Так же, как и цикл for..in , эти методы игнорируют свойства, использующие Symbol(. ) в качестве ключей.
Обычно это удобно. Но если требуется учитывать и символьные ключи, то для этого существует отдельный метод Object.getOwnPropertySymbols, возвращающий массив только символьных ключей. Также, существует метод Reflect.ownKeys(obj), который возвращает все ключи.
Трансформации объекта
У объектов нет множества методов, которые есть в массивах, например map , filter и других.
Если мы хотели бы их применить, то можно использовать Object.entries с последующим вызовом Object.fromEntries :
- Вызов Object.entries(obj) возвращает массив пар ключ/значение для obj .
- На нём вызываем методы массива, например, map .
- Используем Object.fromEntries(array) на результате, чтобы преобразовать его обратно в объект.
Например, у нас есть объект с ценами, и мы хотели бы их удвоить:
let prices = < banana: 1, orange: 2, meat: 4, >; let doublePrices = Object.fromEntries( // преобразовать в массив, затем map, затем fromEntries обратно объект Object.entries(prices).map((Javascript массив значений объекта) => Javascript массив значений объекта) ); alert(doublePrices.meat); // 8
Это может выглядеть сложным на первый взгляд, но становится лёгким для понимания после нескольких раз использования.
Можно делать и более сложные «однострочные» преобразования таким путём. Важно только сохранять баланс, чтобы код при этом был достаточно простым для понимания.
Задачи
Сумма свойств объекта
Есть объект salaries с произвольным количеством свойств, содержащих заработные платы.
Напишите функцию sumSalaries(salaries) , которая возвращает сумму всех зарплат с помощью метода Object.values и цикла for..of .
Если объект salaries пуст, то результат должен быть 0 .
let salaries = < "John": 100, "Pete": 300, "Mary": 250 >; alert( sumSalaries(salaries) ); // 650
function sumSalaries(salaries) < let sum = 0; for (let salary of Object.values(salaries)) < sum += salary; >return sum; // 650 > let salaries = < "John": 100, "Pete": 300, "Mary": 250 >; alert( sumSalaries(salaries) ); // 650
Или, как вариант, мы можем получить сумму, используя методы Object.values и reduce :
// reduce перебирает массив значений salaries, // складывает их // и возвращает результат function sumSalaries(salaries) < return Object.values(salaries).reduce((a, b) =>a + b, 0) // 650 >