Скажем, у меня есть:
object1 = {
atk: 3,
def: 6,
hp: 4,
level: 17,
};
object2 = {
atk: 1,
def: 4,
hp: 2,
level: 10,
};
Я хочу умножить два объекта, поэтому я получаю
object3 = {
atk: 3, // 1 * 3
def: 24, // 4 * 6
hp: 8, // 2 * 4
level: 170, // 17 * 10
};
Я пробовал вот так
let obj3 = {};
obj3.atk = object1.atk * object2.atk;
obj3.def= object1.def * object2.def;
//etc....
Но не уверен, что есть более простой способ, поскольку ключей/значений больше, чем я перечислил здесь.
4 ответа
Вы можете использовать комбинацию Object.entries
для распаковки исходного объекта (например, object1
) и сопоставления через него нескольких его значений с соответствующим значением, полученным с помощью key
в качестве метода доступа к object2
.
Как только это будет сделано, нужно использовать Object.fromEntries
, чтобы преобразовать кортежи [key, value]
обратно в объект:
const object1 = {
atk: 3,
def: 6,
hp: 4,
level: 17,
};
const object2 = {
atk: 1,
def: 4,
hp: 2,
level: 10,
};
const object3 = Object.fromEntries(Object.entries(object1).map(([key, value]) => {
value *= object2[key];
return [key, value];
}));
console.log(object3);
Я думаю, что самый элегантный способ сделать это — использовать reduce
метод массива, смешанный с Object.keys()
, которая возвращает массив, содержащий ключи объекта:
const object1 = { atk: 3, def: 6, hp: 4, level: 17, };
const object2 = { atk: 1, def: 4, hp: 2, level: 10 };
const object3 = Object.keys(object1).reduce((result, key) => {
result[key] = object1[key] * object2[key];
return result;
}, {});
console.log(object3);
Я бы создал вспомогательную функцию, которая делает то же самое, что и предыдущие ответы:
const multiplyObjectsByKeys = (a, b) => Object.keys(a).reduce((acc, key) => ({ ...acc, [key]: a[key] * b[key] }), {})
const object3 = multiplyObjectsByKeys(object1, object2)
Если вы используете lodash в своем проекте, вы также можете сделать это следующим образом:
_.assignWith(object1, object2, (a, b) => a * b)
Одним из самых простых (по сложности кода) решений, вероятно, будет использование простого for...in
цикл, перебирающий ключи первого объекта.
const object1 = { atk: 3, def: 6, hp: 4, level: 17 };
const object2 = { atk: 1, def: 4, hp: 2, level: 10 };
const obj3 = {};
for (const key in object1) {
obj3[key] = object1[key] * object2[key];
}
console.log(obj3);
Это предполагает, что object1
и object2
имеют одинаковые ключи.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.