【问题标题】:How to push object keys to an array multiple times based on their integer values in JavaScript如何根据 JavaScript 中的整数值将对象键多次推送到数组
【发布时间】:2021-09-30 08:12:17
【问题描述】:

我在发布此问题时查看了多个网站,包括通过建议的答案,所以如果在其他地方得到回答,请原谅我。我对 JavaScript(和一般编码)非常陌生。我正在做一个“加权彩票”项目,我有一种方法我确信会奏效,但我被困在一个特定的点上。

我有一个对象,其中包含作为对象键的结果以及特定结果将作为整数类型的对象值生成的次数。具体来说:

const weights = {
  'win': 5,
  'loss': 10,
  'tie': 3
}

我想根据对象键的关联值将对象键多次推送到名为“结果”的数组中。对于上面的示例,它会生成一个数组,其中列出了 5 次“赢”、“输”10 次和“平局”3 次。

我遇到过 .fill 方法,但它似乎在这种情况下不起作用,我希望对象项的数量是动态的(包括它们的数量和它们的值 - 即具有15 个不同的“结果”,每个结果都有不同的值)。

有什么建议吗?感谢大家提供这么棒的资源!

【问题讨论】:

  • 创建数组:const outcomes = [];现在迭代并推送Object.entries(weights).forEach(([key, weight) => { for (let i = 0; i < weight; i++) outcomes.push(key); });
  • [].concat(...Object.keys(weights).map(k => Array(weights[k]).fill(k)))

标签: javascript arrays javascript-objects


【解决方案1】:

fill 可以用于此,但我想我只会使用循环:

const outcomes = [];
for (const [key, count] of Object.entries(weights)) {
    for (let n = count; n > 0; --n) {
        outcomes.push(key);
    }
}

现场示例:

const weights = {
    "win": 5,
    "loss": 10,
    "tie": 3
};

const outcomes = [];
for (const [key, count] of Object.entries(weights)) {
    for (let n = count; n > 0; --n) {
        outcomes.push(key);
    }
}
console.log(outcomes);

但是,如果您愿意,可以使用 fillspread

const outcomes = [];
for (const [key, count] of Object.entries(weights)) {
    outcomes.push(...Array.from({length: count}).fill(key));
}

现场示例:

const weights = {
    "win": 5,
    "loss": 10,
    "tie": 3
};

const outcomes = [];
for (const [key, count] of Object.entries(weights)) {
    outcomes.push(...Array.from({length: count}).fill(key));
}
console.log(outcomes);

David's answer 指出了一种比 fill 更好的方法(我忘记了 startend,doh!),但我会稍微不同:

const outcomes = [];
for (const [key, count] of Object.entries(weights)) {
    const start = outcomes.length;
    outcomes.length += count;
    outcomes.fill(key, start, outcomes.length);
}

现场示例:

const weights = {
    "win": 5,
    "loss": 10,
    "tie": 3
};

const outcomes = [];
for (const [key, count] of Object.entries(weights)) {
    const start = outcomes.length;
    outcomes.length += count;
    outcomes.fill(key, start, outcomes.length);
}
console.log(outcomes);

也就是说,David 的答案的优点是您预先告诉 JavaScript 引擎该数组将有多少元素,这些元素可用于优化。它通常不重要,在这里可能也不重要,但它仍然存在。

【讨论】:

  • 我不知道你可以通过添加length 属性来增加数组的大小!令人着迷。
  • @David - 你可以通过减去元素来丢弃元素。 :-D 有优点也有缺点,我在上面最后指出了你的方法的一个优点。
  • 谢谢你教我一些新东西!
  • 谢谢大家!这真的为我清除了它!现在应该可以应付剩下的事情了。没想到这么快就有这么多答案!再次感谢 StackOverflow 永远!
【解决方案2】:

你可以用填充来做到这一点。您可以使用组合权重作为长度参数创建一个新数组,然后像这样填充它。

const weights = {
  'win': 5,
  'loss': 10,
  'tie': 3
};

let outcomes = new Array(Object.values(weights).reduce((value, initial) => value+initial));
let pos = 0;
for(let [key, value] of Object.entries(weights))
{
  outcomes.fill(key, pos, pos += value);
}

console.log(outcomes);

【讨论】:

  • 噢!我忘记了startend
【解决方案3】:

也许这会有所帮助:

const weights = {
  win: 5,
  loss: 10,
  tie: 3
}

const result = []

Object.keys(weights).forEach(name => {
  const times = weights[name]
  result.push(...new Array(times).fill(name))
})

console.log(res)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多