#javascript #arrays #object
#javascript #массивы #объект
Вопрос:
Предположим, у меня есть:
const KEYS = ['b', 'a', 'c']
const obj = {
2018: {a: 1, b: 2, c: 3},
2019: {a: 4, b: 5, c: 6},
2020: {a: 7, b: 8, c: 9},
}
Это то, что я хотел бы получить:
const result = {
2018: {
a: [0, 1, 0],
b: [2, 0, 0],
c: [0, 0, 3]
},
2019: {
a: [0, 4, 0],
b: [5, 0, 0],
c: [0, 0, 6]
},,
2020: {
a: [0, 7, 0],
b: [8, 0, 0],
c: [0, 0, 9]
},
}
результат [‘2018’] объект имеет три ключа. Каждое значение ключа представляет собой массив, содержащий значения в порядке, который задается КЛЮЧАМИ, использующими 0 в качестве значения заполнения.
Как я могу сделать что-то подобное? Это то, что я пробовал, но, очевидно, сложнее, чем это:
const reshaped = Object.entries(obj).map(([key, value]) => {
return { [key]: Object.values(value) }
})
// [
// { 2018: [ 1, 2, 3 ] },
// { 2019: [ 4, 5, 6 ] },
// { 2020: [ 7, 8, 9 ] }
// ]
Комментарии:
1. @Dai отредактируйте основное сообщение, извините
2. Вы написали «Каждое ключевое значение представляет собой массив, содержащий значения в порядке, который задается КЛЮЧАМИ, использующими 0 в качестве значения заполнения». — Я не понимаю, что вы имеете в виду. Пожалуйста, опубликуйте подробное объяснение того, как генерируется желаемый результат (использование простого английского языка подходит) — из того, что вы опубликовали, я не понимаю, как
KEYS
это должно использоваться.
Ответ №1:
Вы можете сопоставить нужные ключи, чтобы построить массив для каждого свойства.
const
KEYS = ['b', 'a', 'c'],
object = { 2018: { a: 1, b: 2, c: 3 }, 2019: { a: 4, b: 5, c: 6 }, 2020: { a: 7, b: 8, c: 9 } },
result = Object.fromEntries(Object.entries(object).map(([k, o]) => [
k,
Object.fromEntries(Object.entries(o).map(([l, v]) => [
l,
KEYS.map(m => l === m ? v : 0)
]))
]));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №2:
Вы можете использовать комбинацию Object.entries
и Object.fromEntries
для сопоставления объекта, а затем просто создать новый массив с длиной КЛЮЧЕЙ arr .
const KEYS = ['b', 'a', 'c']
const obj = {
2018: {a: 1, b: 2, c: 3},
2019: {a: 4, b: 5, c: 6},
2020: {a: 7, b: 8, c: 9},
}
const result = Object.fromEntries( // Create obj from array of entries
Object.entries(obj).map(([key, value]) => [ // create array of entries from obj and map it
key,
Object.fromEntries( // do the same obj/arr transformation on the value
Object.entries(value).map(([subKey, subValue]) => {
const arr = new Array(KEYS.length).fill(0); // create new array of keys length and fill all zeroes
arr[KEYS.indexOf(subKey)] = subValue; // on the index of the key in the KEYS arr, set the value of the key
return [subKey, arr]; // return subValue
})
)
])
);
console.log(result);