Вставка массива в массив и использование его выбрасывает NaN - PullRequest
0 голосов
/ 21 января 2019

У меня есть переменная с именем 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] - нет?

Заранее спасибо!

1 Ответ

0 голосов
/ 21 января 2019

Как сказано в комментариях, когда вы разделяете () строку, сгенерированный массив будет содержать строки:

Метод split () разбивает объект String на массив строк , разделяя строку на подстроки, используя указанную строку-разделитель для определения места каждого разбиения.

Таким образом, на самом деле массив 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]));
...