按前一个值的百分比排列
Array by percentage of the previous value
我有一个字符串数组、金额和百分比。
在对象中找到每个键。
它的值等于之前的值加上百分比。
这是我写的代码:
const keys = ['a', 'b', 'c'];
const amount = 300;
const precentage = 0.5;
const obj = {};
let prevAmount = amount;
for (let i = 0; i < keys.length; i++) {
if (i !== 0) {
obj[keys[i]] = prevAmount + prevAmount * precentage;
prevAmount = prevAmount + prevAmount * precentage;
} else {
obj[keys[i]] = amount;
prevAmount = amount;
}
}
obj
是:
{a: 300, b: 450, c: 675}
我不喜欢这段代码。对我来说太长了。
有没有办法让它更具可读性和简短性?
您可以简单地跟踪之前的金额并在每次迭代时更新它。
const keys = ['a', 'b', 'c'];
const amount = 300;
const percentage = 0.5;
const result = {};
let prev = amount;
for (const key of keys) {
result[key] = prev;
prev = prev + (prev * percentage);
}
console.log(result)
你可以使用 reduce
const createObj = (keys, amount, percentage) => keys.reduce((res, key, i) => {
if (i === 0)
return res
return {
...res,
[key]: res[keys[i - 1]] * (1.0 + percentage)
}
}, {
[keys[0]]: amount
})
const keys = ['a', 'b', 'c'];
const amount = 300;
const precentage = 0.5;
const result = createObj(keys, amount, precentage)
console.log(result)
这里我没有使用单独的变量来存储prevAmount。
你可以从对象本身抓取它。
首先将初始金额分配给对象,因为它不会改变。
然后从索引 1 而不是索引 0 开始迭代键数组。
const keys = ["a", "b", "c"];
const amount = 300;
const precentage = 0.5;
const obj = {};
obj[keys[0]] = amount;
for (let i = 1; i < keys.length; i++) {
obj[keys[i]] = obj[keys[i - 1]] * (precentage + 1);
}
console.log(obj);
也许reduce
与由累加对象和累加量组成的累加器一起使用?
const keys = ['a', 'b', 'c'];
const amount = 300;
const percentage = 0.5;
const obj = keys.reduce(({obj, amount}, key) => (
obj[key] = amount, {obj, amount: amount * (1 + percentage)}
), {obj: {}, amount}).obj;
console.log(obj); //{a: 300, b: 450, c: 675}
这可能是另一种解决方案。
const keys = ['a', 'b', 'c'];
const amount = 300;
const percentage = 0.5;
function makeObj(keys, amount, percentage) {
const result = {
[keys[0]]: amount,
};
keys.forEach((k, i, arr) => {
if (i === 0) return;
const prevValue = result[arr[i - 1]];
result[k] = prevValue + prevValue * percentage;
});
return result;
}
makeObj(keys, amount, percentage);
您可以使用 Array.prototype.reduce 并将 keys
数组缩减为所需的对象。
const
keys = ["a", "b", "c"],
amt = 300,
percentage = 0.5,
res = keys.reduce((r, k, i, a) => ((r[k] = i > 0 ? r[a[i - 1]] * (1 + percentage) : amt), r), {});
console.log(res);
另一种方式:
const keys = ['a', 'b', 'c'];
const amount = 300;
const precentage = 0.5;
const obj = {};
keys.reduce((prev, current, index) => {
obj[current] = prev + (index == 0 ? 0 : amount * precentage)
return (obj[current])
}, amount)
console.log(obj)
我有一个字符串数组、金额和百分比。
在对象中找到每个键。 它的值等于之前的值加上百分比。
这是我写的代码:
const keys = ['a', 'b', 'c'];
const amount = 300;
const precentage = 0.5;
const obj = {};
let prevAmount = amount;
for (let i = 0; i < keys.length; i++) {
if (i !== 0) {
obj[keys[i]] = prevAmount + prevAmount * precentage;
prevAmount = prevAmount + prevAmount * precentage;
} else {
obj[keys[i]] = amount;
prevAmount = amount;
}
}
obj
是:
{a: 300, b: 450, c: 675}
我不喜欢这段代码。对我来说太长了。
有没有办法让它更具可读性和简短性?
您可以简单地跟踪之前的金额并在每次迭代时更新它。
const keys = ['a', 'b', 'c'];
const amount = 300;
const percentage = 0.5;
const result = {};
let prev = amount;
for (const key of keys) {
result[key] = prev;
prev = prev + (prev * percentage);
}
console.log(result)
你可以使用 reduce
const createObj = (keys, amount, percentage) => keys.reduce((res, key, i) => {
if (i === 0)
return res
return {
...res,
[key]: res[keys[i - 1]] * (1.0 + percentage)
}
}, {
[keys[0]]: amount
})
const keys = ['a', 'b', 'c'];
const amount = 300;
const precentage = 0.5;
const result = createObj(keys, amount, precentage)
console.log(result)
这里我没有使用单独的变量来存储prevAmount。 你可以从对象本身抓取它。
首先将初始金额分配给对象,因为它不会改变。
然后从索引 1 而不是索引 0 开始迭代键数组。
const keys = ["a", "b", "c"];
const amount = 300;
const precentage = 0.5;
const obj = {};
obj[keys[0]] = amount;
for (let i = 1; i < keys.length; i++) {
obj[keys[i]] = obj[keys[i - 1]] * (precentage + 1);
}
console.log(obj);
也许reduce
与由累加对象和累加量组成的累加器一起使用?
const keys = ['a', 'b', 'c'];
const amount = 300;
const percentage = 0.5;
const obj = keys.reduce(({obj, amount}, key) => (
obj[key] = amount, {obj, amount: amount * (1 + percentage)}
), {obj: {}, amount}).obj;
console.log(obj); //{a: 300, b: 450, c: 675}
这可能是另一种解决方案。
const keys = ['a', 'b', 'c'];
const amount = 300;
const percentage = 0.5;
function makeObj(keys, amount, percentage) {
const result = {
[keys[0]]: amount,
};
keys.forEach((k, i, arr) => {
if (i === 0) return;
const prevValue = result[arr[i - 1]];
result[k] = prevValue + prevValue * percentage;
});
return result;
}
makeObj(keys, amount, percentage);
您可以使用 Array.prototype.reduce 并将 keys
数组缩减为所需的对象。
const
keys = ["a", "b", "c"],
amt = 300,
percentage = 0.5,
res = keys.reduce((r, k, i, a) => ((r[k] = i > 0 ? r[a[i - 1]] * (1 + percentage) : amt), r), {});
console.log(res);
另一种方式:
const keys = ['a', 'b', 'c'];
const amount = 300;
const precentage = 0.5;
const obj = {};
keys.reduce((prev, current, index) => {
obj[current] = prev + (index == 0 ? 0 : amount * precentage)
return (obj[current])
}, amount)
console.log(obj)