Помните, что при 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]
.)