如何将数字值转换为在列表中索引最大为1的数组中具有单独值的数组

时间:2019-06-12 11:09:20

标签: javascript arrays arraylist

需要帮助。

我有示例值4.8(这是等级4.8 / 5的值)

现在我需要将其转换成数组,其中数组应该像这样

[1, 1, 1, 1, 0.8]

我是什么意思?它应该取值并用5个元素组成数组,但每个索引不得超过1。

其他示例:

2.8应为[1、1、0.8、0、0]

0.5应该是[0.5,0,0,0,0]

5应该是[1、1、1、1、1]

3应该是[1、1、1、0、0]

等...

let number = 4.8;

6 个答案:

答案 0 :(得分:3)

您可以通过将长度设置为5来使用Array.from()。在每个长度上取最小值,取0到最大值num - i或1:

const convert = num => Array.from({ length: 5 }, 
  (_, i) =>  Math.max(Math.min(num - i, 1), 0)
)

console.log(convert(4.5))
console.log(convert(2.5))
console.log(convert(0.5))
console.log(convert(5))

如果精度是一个问题,我添加了一个safeSubtract函数来处理:

const safeSubtract = (n, i) => {
  const [int, dec = ''] = String(n).split('.')
  return +`${+int - i}.${dec}`
};

const convert = num => Array.from({ length: 5 }, 
  (_, i) =>  Math.max(Math.min(safeSubtract(num, i), 1), 0)
)

console.log(convert(4.8))
console.log(convert(2.8))
console.log(convert(0.8))
console.log(convert(5))

答案 1 :(得分:2)

注意:我处理了四舍五入的问题,该问题在其他一些答案中(至少在第一个版本中)将0.8转换为0.7999999999999998

const conv = n => {
  let [whole, dec] = ("" + n).split("."); // split the number
  let newArr = Array
    .from({length: 5})  // create a 5 item long array
    .fill(1, 0, whole)  // fill with 1s until the whole number
    .fill(0, whole, 5); // fill with 0s for the rest
  if (dec) newArr[whole] = +("." + dec); // insert the decimals if needed
  return newArr;
}

// test:
[2.8, .5, 5, 3, 4.789].map(n => console.log(n,":",...conv(n)))

答案 2 :(得分:1)

您可以计算每个位置,然后获取其余位置用于下一个循环。

function getStars(v) {
    return Array.from({ length: 5 }, _ => Math.max(Math.min(v--, 1), 0));
}

console.log(...getStars(0.5));
console.log(...getStars(2));
console.log(...getStars(2.8)); // needs some rounding ...

答案 3 :(得分:0)

获取基本整数和十进制数。无论有多少整数,都用1填充起始索引。然后,在下一个索引中添加小数。您可能需要做一些检查,以确保数量小于5(您的数组大小);

    let arr = [0, 0, 0, 0, 0];
    let number = 4.8;
    let base = Math.floor(number);
    let decimal = number - base;

    for(let i=0; i<base; i++) {
       arr[i] = 1;
    }
    arr[base] = decimal;

答案 4 :(得分:0)

编辑:我现在处理舍入问题。

您可以尝试使用numToArray函数,如下所示:

function numToArray(num) {
  let intPart = Math.floor(num)
  let result = Array()
  for(let i = 0; i < intPart; i++) {
    result.push(1)
  }
  if(num > intPart) {
    result.push(Number((num - intPart).toFixed(2)))
  }
  return result
}



console.log(numToArray(2.8))
console.log(numToArray(4.5))
console.log(numToArray(0.8))
console.log(numToArray(4))

答案 5 :(得分:0)

可以做这样的事情:

let n = 3.8;
let arr = [0, 0, 0, 0, 0];
let i = 0;
for (; n > 0; n--) {
	arr[i] = n >= 1 ? 1 : parseFloat(n.toFixed(10)); // Fixing js float problems
	i++;
}
console.log(arr);