需要帮助。
我有示例值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;
答案 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);