как обновить массив вложенных объектов в javascript

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Я хотел бы знать, как обновить массив объектов в javascript.

как обновить original_sample с помощью примеров объектов, отправленных в качестве аргумента функции, и выполнить вычисление, как показано

здесь показано, как выполнить разные вычисления with payfee и without payfee в одной функции и обновить объект

Попал в тупик и как это сделать в javascript.

 // update the original_sample with sample2 values
var res = getValue(original_sample, sample2);
// update the original_sample with sample3 values
var res = getValue(original_sample, sample3);
function getValue(original, sample){
return original.map(({ fee, rate, ...others }) => ({
    id: 'trans'
    amount: amount,
    fee:  fee,
    rate:  rate,
    targetamount: (amount-fee)*rate
  }))
}
  
 //inputs
var original_sample= [{
     id: "trans",
     fee: 1,
     rate: 2.2,
     amount:100,
  }]
//passed as input to update original_sample
var sample2 = [{
   id: "trans",
   fee: 2,
   rate: 4.0,
   payfee: 1%,
   amount: 100,
  }]
//passed as input to update original_sample
var sample3 =[{
 id: "trans",
 fee: 1,
 rate: 1.0,
 amount: 100
   }]
  
 Expected Result:
//getValue(original_sample, sample2);
res= [{
   id: "trans"
   fee: 2,
   rate: 4.0,
   payfee: 1,
   amount: 100,
targetamount: 388.08
    }]

//getValue(original_sample, sample3);
res=[{
 id: "trans",
 fee: 1,
 rate: 1.0,
 amount: 100,
targetamount: 99
   }]

  

Комментарии:

1. Совсем не ясно, чего вы ожидаете getValue от выполнения. Не могли бы вы, пожалуйста, написать четкую спецификацию?

2. @trincot спасибо за ответ, getValue обновит original_sample значениями sample2, если свойство sample2 не существует в original_sample, затем добавьте еще, обновите значение

3. В ваших примерах всегда есть только один объект в массивах. Что должно произойти, если в них original_sample и sample2 есть, скажем, 3 и 5 объектов?

4. @ в моем сценарии это единственный объект для обоих sample2 и original_sample

5. Тогда я бы предложил полностью отказаться от массивов и просто работать с внутренними объектами.

Ответ №1:

Используйте Array.concat() для объединения массивов, а затем сведите объединенный массив к объекту, всегда беря последний объект с тем же id значением и вычисляя targetAmount . Преобразовать обратно в массив с помощью Object.values() .

 const getValue = (original, sample) =>
  Object.values(
    original.concat(sample)
    .reduce((r, o) => ({
      ...r,
      [o.id]: {
        ...o,
        targetamount: (o.amount - o.fee) * o.rate
      }
    })
    , {})
  )

const original_sample = [{"id":"trans","fee":1,"rate":2.2,"amount":100}]
const sample2 = [{"id":"trans","fee":2,"rate":4,"payfee":0.01,"amount":100}]
const sample3 = [{"id":"trans","fee":1,"rate":1,"amount":100}]

const originalAnd2 = getValue(original_sample, sample2)
const original2And3 = getValue(originalAnd2, sample3)

console.log(originalAnd2);

console.log(original2And3);  

Ответ №2:

Поскольку у вас есть только один объект в каждом массиве, я бы либо полностью отказался от использования массивов, либо извлекал объект каждый раз, когда вам нужно что-то сделать. Например, так:

 function getValue(orig, update) {
    var obj = orig[0] = Object.assign({}, update[0]);
    if ("payfee" in obj) obj.payfee = parseInt(obj.payfee);
    obj.targetamount = (obj.amount-obj.fee) * (1 - (obj.payfee||0)/100) * obj.rate;
}

// Demo:
var original_sample = [{id: "trans", fee: 1, rate: 2.2, amount:100}];
var sample2 = [{id: "trans", fee: 2, rate: 4.0, payfee: "1%", amount: 100}];
var sample3 = [{id: "trans", fee: 1, rate: 1.0, amount: 100}];

getValue(original_sample, sample2);
console.log(original_sample);
getValue(original_sample, sample3);
console.log(original_sample);