#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);