Попытка сравнить элементы в массиве, чтобы увидеть, являются ли они одинаковыми - PullRequest
0 голосов
/ 07 июня 2019

Я создаю функцию с циклом for и оператором if, чтобы проверить, являются ли все элементы, хранящиеся в данном массиве, одинаковыми, то есть 1,1,1,1 или «a», «a», «a», "a" Если они есть, я хочу, чтобы "true" возвращалось, а если не "false"

function isSame(arr) {
var compare = i
for(i = 0; i <= arr.length-1; i++){
if(arr[0] == compare)
console.log(true)
else {
    return false;
}}
}

, то в настоящее время я возвращаю false, независимо от того, что я вставил.

Ответы [ 7 ]

3 голосов
/ 07 июня 2019

Вы можете использовать Set для получения уникальных значений. Если есть только один уникальный, значит, элементы массива одинаковы.

let checkIfSame = (a) => new Set(a).size === 1;

console.log( checkIfSame( [1, 1, 1, 1] ) );
console.log( checkIfSame( [1, 1, 3, 1] ) );
2 голосов
/ 07 июня 2019

i еще не определено, когда вы делаете var compare = i, поэтому compare инициализируется как undefined. Затем вы никогда не обновите compare снова. Поэтому ваш текущий код просто делает if (arr[0] == undefined) для каждого элемента.

Альтернативой может быть использование .every(), которое возвращает логическое значение, указывающее, удовлетворяет ли каждый элемент в массиве данному предикату.

const isSame = (arr) => arr.every(i => i === arr[0]);

console.log( isSame(['1','1','1']) );
console.log( isSame(['a','b','c']) );
0 голосов
/ 07 июня 2019

const getUniqueValues = arr => arr.filter((x, i, a) => a.indexOf(x) == i)
const isSame = arr => arr.length > 1 && getUniqueValues(arr).length === 1 ? true:false

console.log(isSame([1])) //false
console.log(isSame([1,2,3,4,4])) //false
console.log(isSame(['a','a','b'])) //false
console.log(isSame([1,1,1,1,1])) //true
console.log(isSame(['a','a','a','a'])) //true
0 голосов
/ 07 июня 2019

Как и другие отмечали, в первой строке var compare = i функции isSame() будет храниться значение undefined для переменной compare, при этом в вашем цикле всегда сравнивается первый элемент из array со значением undefined на каждой итерации.

Было бы намного лучше, если бы вы сравнили первый элемент массива с другими элементами.Примерно так:

function isSame(arr)
{
    for (let i = 1; i < arr.length; i++)
    {
        if (arr[i] !== arr[0])            
            return false;
    }

    return true;
}

console.log(isSame([1,1,1]));
console.log(isSame([1,2,1]));
console.log(isSame([]));
console.log(isSame([1]));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

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

console.log({key:"value"} === {key:"value"});
console.log([1,2] === [1,2]);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
0 голосов
/ 07 июня 2019

Когда вы инициализируете compare с помощью i, в этот момент i вообще не определяется. Сейчас вы пытаетесь сравнить каждый элемент массива с undefined. Вот почему вы получаете ложь. Вы должны изменить свой код на что-то вроде этого:

function isSame(arr) {
  var compare = arr[0];
  var allSame = true;
  for(var i=0; i < arr.length; i++) {
    if(!allSame) return allSame;
    allSame = arr[i] === compare;
  }
  return allSame;
}

В синтаксисе ES6 его также можно упростить до:

function isSame(arr) {
 return arr.every(item => item === arr[0]);
}
0 голосов
/ 07 июня 2019

вы никогда не вернете истину.Однако, если вы сделали, ваш алгоритм не является правильным.Например, как говорили другие, вы объявляете свой i какому-то значению, которое не определено.Вот пример, который работает для вашей цели.Единственное ограничение, которое вы, возможно, захотите рассмотреть, это если аргумент на самом деле является массивом

function isSame(arr){  
if (arr.length === 0)
    return true
let toReturn = true
const firstElement = arr[0]

for (let element of arr){
    if (element !== firstElement){
        toReturn = false
        break
    }
}
return toReturn

}

0 голосов
/ 07 июня 2019

Вы должны изменить переменную compare = arr [0], чтобы сохранить первый элемент и цикл для сравнения с оставшимся элементом.

var arr = [1,1,1,1];
function isSame(arr) {
var compare = arr[0]
var result = true;
for(i = 0; i <= arr.length-1; i++){
if(arr[i] == compare){
console.log(true)
}
else {
    return false;
}}

return result;
}

console.log(isSame(arr));

var arr = [1,1,1,1];
function isSame(arr) {
var compare = arr[0]
var result = true;
for(i = 0; i <= arr.length-1; i++){
if(arr[i] == compare){
console.log(true)
}
else {
    return false;
}}

return result;
}

console.log('is same? ' + isSame(arr));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...