如何在Javascript中均匀地展开数组的内容并使用特定值填充空槽?[关闭]

dnph8jn4  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(118)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

昨天关门了。
Improve this question
我有3个输入:一个数组、一个总计数整数和一个任意值。

input_array = ['hello', 'there', 'world']
total_count = 15
fill_value = null

预期输出:

output = [
  'hello',
   null,
   null,
   null,
   null,
   'there',
   null,
   null,
   null,
   null,
   'world',
   null,
   null,
   null,
   null,
]

假设input_array的长度不超过total_count,其他场景:

  • 如果total_count3,则得到['hello', 'there', 'world']
  • 如果total_count4,则得到['hello', null, 'there', 'world']
  • 等等等等。

你可以使用Math.ceil((total_count - input_array.length) / input_array.length)并使用该值来填充插槽,但我不确定最干净的语法是什么。

dtcbnfnu

dtcbnfnu1#

您可以使用Array#flatMap来构造最终数组。

function createArr(initial, count, fill) {
  const each = Math.floor(count / initial.length) - 1, rem = count % initial.length;
  return initial.flatMap((x, i) => [x, ...Array(each + (i < rem)).fill(fill)]);
}
console.log(createArr(['hello', 'there', 'world'], 15, null));
console.log(createArr(['hello', 'there', 'world'], 4, null));
console.log(createArr(['hello', 'there', 'world'], 3, null));
ct2axkht

ct2axkht2#

诀窍在于找出元素的位置,如果元素的数量不适合输出数组,则每个索引将被前一个元素向右推1,以平均分配开销:

function fillPadded(arr, count, fillWith){
  const filled = Array(count).fill(fillWith)
  const step = Math.floor(count/arr.length)
  const offs = count%arr.length
  for(let i = 0; i < arr.length; i++){
    const pos = i*step + (i <= offs ? i : offs) // or Math.min(i, offs)
    filled[pos] = arr[i]
  }
  return filled
}

console.log(JSON.stringify(fillPadded(['hello', 'there', 'world', 'foo'], 9, null)))
console.log(JSON.stringify(fillPadded(['hello', 'there', 'world', 'foo'], 10, null)))
console.log(JSON.stringify(fillPadded(['hello', 'there', 'world', 'foo'], 11, null)))
console.log(JSON.stringify(fillPadded(['hello', 'there', 'world'], 15, null)))
.as-console-wrapper { max-height: 100% !important; top: 0; }

相关问题