Как объединить два объекта по ключу и сумме? - PullRequest
0 голосов
/ 19 апреля 2020

Если у меня есть два объекта в javascript, таких, что объект a

  let relative_weight = {
      "Composure": 0.175,
      "Build": 0.128,
      "Strategic": 0.096, 
      "Career": 0.079,
      "Change": 0.062, 
      "Participative": 0.059, 
      "SelfAware": 0.055, 
      "Leading": 0.048, 
      "Taking": 0.047, 
      "Balance": 0.041, 
      "Putting": 0.041, 
      "Compassion": 0.039, 
      "Decisive": 0.037, 
      "Respect": 0.033,
      "Quick": 0.031, 
      "Confront": 0.028 
    }

и объект b

let values = {
      Strategic: 1,
      Decisive: 1,
      Quick: 1,
      Change: 1,
      Leading: 1,
      Confront: 1,
      Build: 1,
      Compassion: 1,
      Putting: 1,
      Respect: 1,
      Taking: 1,
      Composure: 1,
      Balance: 1,
      SelfAware: 1,
      Career: 1, 
      Participative: 1
}

Как мне получить несколько значений в объекте a и b, а затем суммировать результаты для получения одного значения?

Я посмотрел на SO, но на самом деле не нашел много, что могло бы мне помочь; по крайней мере, я не мог сказать, что делать с теми, кого нашел. Я попробовал, но не сработало. Затем я понял, что тот, который я попробовал, был решением для python, потому что я ищу словарь терминов. Я немного растерялся, как это сделать в JavaScript.

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Это очень просто. Найдите ключи от предметов. Вы можете начать с предположения, что набор ключей идентичен (но вы должны подтвердить это предположение), а затем перебрать ключи и накопить сумму продукта.

let values = {Strategic:1,Decisive:1,Quick:1,Change:1,Leading:1,Confront:1,Build:1,Compassion:1,Putting:1,Respect:1,Taking:1,Composure:1,Balance:1,SelfAware:1,Career:1,Participative:1}
let relative_weight = {"Composure":0.175,"Build":0.128,"Strategic":0.096,"Career":0.079,"Change":0.062,"Participative":0.059,"SelfAware":0.055,"Leading":0.048,"Taking":0.047,"Balance":0.041,"Putting":0.041,"Compassion":0.039,"Decisive":0.037,"Respect":0.033,"Quick":0.031,"Confront":0.028 }

let result = 0
for (let key of Object.keys(values)) {
   // assumes that both maps hold the same keys, if either doesn't 0 will be added
   result += values[key] * relative_weight[key]
}
console.log(result)

Это фактически логически эквивалентно использованию метода Array .reduce():

console.log(Object.keys(values).reduce((accumulator, currentValue) => accumulator + values[currentValue] * relative_weight[currentValue], 0))
0 голосов
/ 19 апреля 2020

Вы можете l oop объектов с for(.. in ..)

const relativeWeight = {
  "Composure": 0.175,
  "Build": 0.128,
  "Strategic": 0.096, 
  "Career": 0.079,
  "Change": 0.062, 
  "Participative": 0.059, 
  "SelfAware": 0.055, 
  "Leading": 0.048, 
  "Taking": 0.047, 
  "Balance": 0.041, 
  "Putting": 0.041, 
  "Compassion": 0.039, 
  "Decisive": 0.037, 
  "Respect": 0.033,
  "Quick": 0.031, 
  "Confront": 0.028 
}
const values = {
  Strategic: 1,
  Decisive: 1,
  Quick: 1,
  Change: 1,
  Leading: 1,
  Confront: 1,
  Build: 1,
  Compassion: 1,
  Putting: 1,
  Respect: 1,
  Taking: 1,
  Composure: 1,
  Balance: 1,
  SelfAware: 1,
  Career: 1, 
  Participative: 1
}
function multiplyObjects(objA, objB){
  const outputObj = {};
  for(prop in objA){
    outputObj[prop] = objB[prop] * objA[prop];
  }
  return outputObj;
}
function sumArray(arr){
  return arr.reduce((acc, val) => acc+val, 0);
}
console.log('functional programming version:', sumArray(Object.values(multiplyObjects(relativeWeight, values))));

// or you can only use a single loop for both multiply and add:

function operateOnObjects(objA, objB, operationFn){
  const outputObj = {};
  for(prop in objA){
    outputObj[prop] = operationFn(objB[prop], objA[prop]);
  }
  return outputObj;
}

function multiplyAndAddObjects(objA, objB){
  let sum = 0;
  let multipliedOutput = operateOnObjects(relativeWeight, values, (a,b) => {
    sum += a*b;
  });
  return sum;
}
console.log('single loop:', multiplyAndAddObjects(relativeWeight, values));

// to solve the precision error, multiply to ensure it is not a floating
// point number and then divide by the same afterwards

function customMultiplyAndAddObjects(objA, objB){
  let sum = 0;
  const sfAmount = 1000;
  let multipliedOutput = operateOnObjects(relativeWeight, values, (a,b) => {
    sum += a*sfAmount*b;
  });
  return sum / sfAmount;
}

console.log('precision fixed:', customMultiplyAndAddObjects(relativeWeight, values));

Это чище, чем для (.. of ..), который потребует от вас сначала преобразовать объект в массив, например, с помощью Object.entries (obj).

0 голосов
/ 19 апреля 2020
const sums = []
for (let [key, value_a] of Object.entries(relative_weight)) {
    let value_b = values[key]
    sums.push(value_a * value_b)
}
console.log(sums.reduce((accum, current) => accum + current))

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries

...