按前一个值的百分比排列

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)