Мне нужно сравнить все значения в одном массиве , чтобы узнать, все ли они равны или нет. Так что это работает нормально и дает мне ожидаемый результат

var myArray1 = [50, 50, 50, 50, 50];  // all values are same, should return true
var myArray2 = [50, 50, 50, 50, 51];  // last value differs, should return false

function compare(array) {
    var isSame = true;
    for(var i=0; i < array.length; i++) {
       isSame = array[0] === array[i] ? true : false;
    }
    return isSame;
}

console.log('compare 1:', compare(myArray1)); // true 
console.log('compare 2:', compare(myArray2)); // false

Затем я попробовал то же самое с уменьшением ( ) но похоже, что я неправильно понимаю эту функцию. Они оба говорят, что это неправда. Я делаю что-то явно неправильно? Могу ли я использовать reduce(), чтобы получить то, что мне нужно? Если так, как?

var myArray1 = [50, 50, 50, 50, 50];
var myArray2 = [50, 50, 50, 50, 51];

console.log('reduce 1:', myArray1.reduce(
  function(a, b){
    return a === b ? true : false
  }
));

console.log('reduce 2:', myArray2.reduce(
  function(a, b){
    return a === b ? true : false
  }
));
4
caramba 10 Янв 2017 в 13:02

4 ответа

Лучший ответ

reduce здесь просто не тот инструмент, значение, которое вы возвращаете из одной итерации, используется как a на следующей итерации, а reduce не закорачивает.

Если вы хотите использовать для этого один из методов массива, every будет разумным выбором:

var myArray1 = [50, 50, 50, 50, 50];
var myArray2 = [50, 50, 50, 50, 51];

console.log('some 1:', myArray1.every(
  function(value, _, array){
    return array[0] === value;
  }
));

console.log('some 2:', myArray2.every(
  function(value, _, array){
    return array[0] === value;
  }
));

every короткое замыкание, остановка, как только результат известен.

Я имею в виду, что вы могли бы подсовывать это в reduce, но это не подходит. Мы инициализируем флаг с помощью true, а затем распространяем результат &&, проверяя эту запись по первой записи массива:

var myArray1 = [50, 50, 50, 50, 50];
var myArray2 = [50, 50, 50, 50, 51];

console.log('some 1:', myArray1.reduce(
  function(flag, value){
    return flag && myArray1[0] === value;
  },
  true
));

console.log('some 2:', myArray2.reduce(
  function(flag, value){
    return flag && myArray2[0] === value;
  },
  true
));
7
T.J. Crowder 10 Янв 2017 в 10:11

Обычный способ - использовать функтор .every(). Если бы я настоял, я бы нашел решение .reduce() следующим образом;

var arr = [50,50,50,50,50],
    brr = [50,50,51,50,50],
    res = arr.reduce((p,c) => p === c ? p : false);
console.log(res);
res = brr.reduce((p,c) => p === c ? p : false);
console.log(res);

Он вернет элемент, которым заполнен массив, или false, если есть черная овца. Приведенный выше код завершится ошибкой, если ваш входной массив заполнен false с.

0
Redu 10 Янв 2017 в 10:46

Попробуйте (если они числовые) таким образом

var myArray1 = [50, 50, 50, 50, 50];
var myArray2 = [50, 50, 50, 50, 51];

var same = myArray1 >= myArray2 && myArray1 <= myArray2;
-1
Romko 10 Янв 2017 в 10:07

Вы можете использовать действительно уменьшить (объяснение в коде)

var myArray1 = [50, 50, 50, 50, 50];
var myArray2 = [50, 50, 50, 50, 51];

var isEqual = myArray1.reduce(function(res, v1, idx) {
    var v2 = myArray2[idx]; // value from other array at same index
    return res && v1 === v2; // if result is true so far AND also the current values are equal
}, true) // start the evaluation with true so that initially res will be true -> once at least one v1 === v2 will yield false, res will be false from then on

ПРИМЕЧАНИЕ: это работает только при условии, что ваши массивы существуют, а не пусты и имеют одинаковый размер. Вы можете настроить для поддержки этих исключительных случаев

0
Ovidiu Dolha 10 Янв 2017 в 10:04