将数组推入数组并使用它会抛出 NaN
Pushing array into array and using it throws NaN
我有一个名为 colorHM 的变量:
var colorHM = "50,50,74,255,100,255,4,3,50".
现在我在这里使用此代码段按照以下方案将其切割成碎片:R,g,b,R,g,b,R,g,b
,然后再次切割成 var a = R,g,b
和 var b = R,g,b
等...
var firstColorHM = colorHM.split(",", 3);
firstColorHM = firstColorHM.toString();
var firstColorHMA = firstColorHM.split(",");
firstCMA.push(firstColorHMA[0]);
firstCMA.push(firstColorHMA[1]);
firstCMA.push(firstColorHMA[2]);
但是用它来计算 distance = eDist(firstCMA, firstCTA)
得到 NaN
。
function eDist (col1, col2) {
var rmean = ((col1[0] + col2[0]) / 2);
var dR = (col1[0] - col2[0]);
var dG = (col1[1] - col2[1]);
var dB = (col1[2] - col2[2]);
return Math.sqrt((2 + (rmean / 256)) * Math.pow(dR, 2) + (4 * Math.pow(dG, 2)) + ( 2 + ((255- rmean) / 256)) * Math.pow(dB, 2));
}
使用 firstCMA.push(10); firstCMA.push(20); firstCMA.push(30);
而不是 firstCMA.push(firstColorHMA[0]);..
使其再次工作。
变量firstCTA
被省略,但解析方式相同。
我只是通过尝试从数组中调用不同的索引来检查数组是否正常工作。
为什么推送数字有用,但推送 firstColorHMA[0]
不行?
提前致谢!
正如评论所说,当你 split() 一个字符串时,生成的数组将包含字符串:
The split() method splits a String object into an array of strings by separating the string into substrings, using a specified separator string to determine where to make each split.
所以实际上数组 firstColorHMA
将数字保存为字符串,一个简单的解决方法是使用 unary plus
将数组项转换为数字,如下所示:
firstCMA.push(+firstColorHMA[0]);
firstCMA.push(+firstColorHMA[1]);
firstCMA.push(+firstColorHMA[2]);
或者,使用更明确的逻辑,例如:
firstCMA.push(Number(firstColorHMA[0]));
firstCMA.push(Number(firstColorHMA[1]));
firstCMA.push(Number(firstColorHMA[2]));
我有一个名为 colorHM 的变量:
var colorHM = "50,50,74,255,100,255,4,3,50".
现在我在这里使用此代码段按照以下方案将其切割成碎片:R,g,b,R,g,b,R,g,b
,然后再次切割成 var a = R,g,b
和 var b = R,g,b
等...
var firstColorHM = colorHM.split(",", 3);
firstColorHM = firstColorHM.toString();
var firstColorHMA = firstColorHM.split(",");
firstCMA.push(firstColorHMA[0]);
firstCMA.push(firstColorHMA[1]);
firstCMA.push(firstColorHMA[2]);
但是用它来计算 distance = eDist(firstCMA, firstCTA)
得到 NaN
。
function eDist (col1, col2) {
var rmean = ((col1[0] + col2[0]) / 2);
var dR = (col1[0] - col2[0]);
var dG = (col1[1] - col2[1]);
var dB = (col1[2] - col2[2]);
return Math.sqrt((2 + (rmean / 256)) * Math.pow(dR, 2) + (4 * Math.pow(dG, 2)) + ( 2 + ((255- rmean) / 256)) * Math.pow(dB, 2));
}
使用 firstCMA.push(10); firstCMA.push(20); firstCMA.push(30);
而不是 firstCMA.push(firstColorHMA[0]);..
使其再次工作。
变量firstCTA
被省略,但解析方式相同。
我只是通过尝试从数组中调用不同的索引来检查数组是否正常工作。
为什么推送数字有用,但推送 firstColorHMA[0]
不行?
提前致谢!
正如评论所说,当你 split() 一个字符串时,生成的数组将包含字符串:
The split() method splits a String object into an array of strings by separating the string into substrings, using a specified separator string to determine where to make each split.
所以实际上数组 firstColorHMA
将数字保存为字符串,一个简单的解决方法是使用 unary plus
将数组项转换为数字,如下所示:
firstCMA.push(+firstColorHMA[0]);
firstCMA.push(+firstColorHMA[1]);
firstCMA.push(+firstColorHMA[2]);
或者,使用更明确的逻辑,例如:
firstCMA.push(Number(firstColorHMA[0]));
firstCMA.push(Number(firstColorHMA[1]));
firstCMA.push(Number(firstColorHMA[2]));