Javascript .reduce Boolean Неожиданное возвращение - PullRequest
0 голосов
/ 18 марта 2019

Попытка создать функцию для проверки большого числа (т. Е. Каждая цифра меньше или равна цифре справа от нее, например, 123, 059 и т. Д.).

Следующий кодпроблема:

const n = parseInt(readline());
if (n.toString().length === 1)
    console.log('true');
else
{
    var z = n.toString().split('');
    console.log(z.reduce((a, b) => b > a));
}

Этот тест не пройден: 01223047 (возвращает true, когда должен возвращать false).

Он работал во многих других тестах, но не в этом значении.Разве не должно быть сокращение тестировать каждую пару и возвращать true / false?Если есть одна ложь, она должна вернуть ложь, правильно?Я использую уменьшить неправильно?Есть ли другая функция, которую я мог бы использовать для сокращения этого теста вместо написания цикла?

1 Ответ

5 голосов
/ 18 марта 2019

Помните, что при reduce первым аргументом, предоставленным вашему обратному вызову, будет возвращаемое значение предыдущего вызова обратного вызова. (В первом вызове, если вы не указали начальное значение & mdash; & mdash; первое значение будет первой записью в массиве.)

Так что нет, reduce не проверяет каждую пару. Он проверяет первую пару, а затем проверяет остальные значения (индивидуально) по сравнению с возвращенным флагом предыдущего обратного вызова.

Для того, что вы делаете, вам, вероятно, нужен простой цикл, или some, или every (вероятно, every). С some и every вы использовали бы индекс, предоставленный в качестве второго аргумента для обратного вызова, чтобы получить следующий (или предыдущий) символ. Использование every также исключит специальный случай для односимвольной строки:

function test(str, expect) {
    const z = str.split(""); // I'd probably use `= Array.from(str);` on ES2015+
    const result = z.every((ch, i) => i === 0 || ch > z[i - 1]);
    console.log(str, result, !result === !expect ? "Good" : "ERRROR");
}


test("123", true);
test("1", true);
test("21", false);

(вероятно, есть аргумент для использования localCompare в этом: ch.localeCompare(z[i - 1]) > 0 вместо ch > z[i - 1].)

...