Скажем, у меня есть:

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....

Но не уверен, что есть более простой способ, поскольку ключей/значений больше, чем я перечислил здесь.

0
Liiaam93 15 Янв 2022 в 21:28
1
Просто перебирать ключи? Ты пробовал?
 – 
trincot
15 Янв 2022 в 21:30

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);
1
Terry 15 Янв 2022 в 21:33
Удивительное спасибо, так много хороших ответов здесь :)
 – 
Liiaam93
15 Янв 2022 в 22:51

Я думаю, что самый элегантный способ сделать это — использовать 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);
1
AlexSp3 15 Янв 2022 в 21:34
«Самый элегантный» основан на мнении и оставляет позади вопрос о производительности.
 – 
mister wtf
15 Янв 2022 в 22:40

Я бы создал вспомогательную функцию, которая делает то же самое, что и предыдущие ответы:

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)
1
maxpsz 15 Янв 2022 в 21:53
Спасибо! Выглядит достаточно просто. У меня был друг, который рекомендовал lodash раньше по другим причинам, поэтому я запишу это.
 – 
Liiaam93
15 Янв 2022 в 22:50

Одним из самых простых (по сложности кода) решений, вероятно, будет использование простого 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 имеют одинаковые ключи.

2
3limin4t0r 15 Янв 2022 в 23:35
Спасибо! Сначала я попытался выполнить цикл for, но, поскольку я не мог получить к ним доступ через индекс, я не знал, куда идти.
 – 
Liiaam93
15 Янв 2022 в 22:45