Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сравнить переменные между собой (https://javascript.ru/forum/misc/62811-sravnit-peremennye-mezhdu-sobojj.html)

Ermite 02.05.2016 10:17

Сравнить переменные между собой
 
Допустим, у меня 5 переменных. Есть какой-нибудь рациональный сравнить их между собой? Я пока остановился на этом:

if (q1 != q2 && q1 != q3 && .... && q4 != q5) {
alert ('Совпадений нет!')
} else {
alert ('Есть совпадения!')
}


Как вы поняли, если переменные все разные, то вывести надо "Совпадений нет", а если какие-либо из них имеют одинаковые значения - вывести "Есть совпадения"!

aklis 02.05.2016 10:27

какие в них данные ожидаются?

aklis 02.05.2016 10:41

forEach, filter, map, indexOF циклы и тд. Думаю много еще чего придумать можно

Ermite 02.05.2016 10:46

aklis, строка со строкой
Для примера:
q1 = 'Name 1';
q2 = 'Name 2';
q3 = 'Name 3';
q4 = 'Name 4';
q5 = 'Name 5';


Значения этих переменных выбираются пользователем и могут быть одинаковыми.

aklis 02.05.2016 11:00

в массив их обернуть можно и любым перебирающим методом проверить. Я бы советовал map или filter - если нужно собрать все совпадения. Если просто установить есть ли хоть одно то хорошо подойдет indexOF

Ermite 02.05.2016 11:09

aklis,
о, а до этого я как-то не додумался, спасибо)

destus 02.05.2016 11:10

Можно сделать в пару строк, используя оператор spread, тип Set и метод Set.prototype.size в es6.

aklis 02.05.2016 11:16

хм

aklis 02.05.2016 11:26

var data = ["Ваня", "Петя", "Кузя", "КуКузя", "Ваня"];

var filtered = data.filter(function(item, i, arr){
  if(~arr.indexOf(item)) return true;
  return false;
});

destus, подскажи пожалуйста: почему не сработало так? Никак не пойму где я ошибся.

destus 02.05.2016 11:27

let data = ['Name 1', 'Name 2', 'Name 3', 'Name 4', 'Name 5'],
		set = new Set(data);
	
	set.size === data.length ? alert('Совпадений нет!') : alert('Есть совпадения!');

destus 02.05.2016 11:30

Цитата:

Сообщение от aklis (Сообщение 415475)
var data = ["Ваня", "Петя", "Кузя", "КуКузя", "Ваня"];

var filtered = data.filter(function(item, i, arr){
  if(~arr.indexOf(item)) return true;
  return false;
});

destus, подскажи пожалуйста: почему не сработало так? Никак не пойму где я ошибся.

Может так?

var data = ["Ваня", "Петя", "Кузя", "КуКузя", "Ваня"];

var filtered = data.filter(function(item, i, arr){
return arr.indexOf(item) === i;
});

alert(filtered);

aklis 02.05.2016 11:41

Все до меня дошло:)

aklis 02.05.2016 11:42

Дело в том что калбэк раз за разом берет значение из массива чтобы искать его в том де массиве, конечно оно там есть=) И так получается что все элементы попадают в результат.

Ermite 02.05.2016 13:01

destus,
вот только значения в массив у меня будут заносить сами пользователи..
будет что-то типа такого:
data = [];
data[0] = q1;
data[1] = q2;
data[2] = q3;
data[3] = q4;
data[4] = q5;

aklis 02.05.2016 13:22

для добавления push пригодится:)

Ermite 02.05.2016 13:44

Ещё вопрос:
Если все переменные равны, то вывести "Все переменные равны" :)
Сейчас у меня что-то типа такого:

var persclass_Arr = [];

persclass_Arr[0] = q1;
persclass_Arr[1] = q2;
persclass_Arr[2] = q3;
persclass_Arr[3] = q4;
persclass_Arr[4] = q5;

		set = new Set(persclass_Arr);
	
	set.size === persclass_Arr.length ? classsov = 0 : classsov = 1; // 0 - есть совпадение, 1 - совпадений нет

aklis 02.05.2016 14:00

Регулярки наверное можно использовать. Очень мощный инструмент для строк. Я пока только мельком читал про них, так что точно не скажу.

destus 02.05.2016 14:28

Ermite,
if (set.size === 1 && persclass_Arr.length > 1)


Часовой пояс GMT +3, время: 22:59.