Object.entries()
возвращает массив, элементы которого являются массивами, соответствующими перечисляемым [key, value]
парам свойств, найденным непосредственно при object
. Порядок свойств такой же, как и при циклическом переключении значений свойств объекта вручную.
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description
В Object.entries
функции возвращает почти точные результаты вы просите, за исключением клавиша являются строками вместо цифр.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
console.log(Object.entries(obj));
Если вам нужно, чтобы ключи были числами, вы можете отобразить результат в новый массив с функцией обратного вызова, которая заменяет ключ в каждой паре на число, полученное из него.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(input);
return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}
console.log(toNumericPairs(obj));
Я использую функцию стрелки и Object.assign
для обратного вызова карты в приведенном выше примере, чтобы я мог сохранить ее в одной инструкции, используя тот факт, что Object.assign
возвращается объект, которому назначен объект, а возвращаемое значение функции стрелки одной инструкции является результатом инструкции.
Это эквивалентно:
entry => {
entry[0] = +entry[0];
return entry;
}
Как упомянуто @TravisClarke в комментариях, функцию карты можно сократить до:
entry => [ +entry[0], entry[1] ]
Однако это создаст новый массив для каждой пары ключ-значение вместо изменения существующего массива на месте, что приведет к удвоению количества созданных пар ключ-значение. Хотя исходный массив записей по-прежнему доступен, он и его записи не будут собираться мусором.
Теперь, хотя при использовании нашего метода на месте все еще используются два массива, которые содержат пары ключ-значение (входной и выходной массивы), общее количество массивов изменяется только на один. Массивы ввода и вывода на самом деле не заполнены массивами, а скорее ссылками на массивы, и эти ссылки занимают незначительное место в памяти.
- Изменение каждой пары ключ-значение на месте приводит к незначительному увеличению объема памяти, но требует ввода еще нескольких символов.
- Создание нового массива для каждой пары ключ-значение приводит к удвоению объема требуемой памяти, но требует ввода нескольких символов меньше.
Вы можете сделать еще один шаг и полностью исключить рост, изменив массив записей на месте, а не сопоставляя его с новым массивом:
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(obj);
entries.forEach(entry => entry[0] = +entry[0]);
return entries;
}
console.log(toNumericPairs(obj));
NaN
вместо этого вернется . Если вы хотите использовать строки как ключи, изменить возвращение из[Number(key), obj[key]]
к[key, obj[key]]
или использовать вObject.entries
качестве @Pila предложило в их ответе