Irtin
@Irtin
Учу JS , PHP

Не понимаю почему не работает for правильно?

Здравствуйте !
Написал цикл , который должен сортировать массив с анаграммами и оставлять только уникальные элементы , но проблема в том что , когда я ставлю на запись в другой массив (sarr) одно значение он записывает а если с другого то нет , в данном случае выведет только 3 значения как и положено
var arr = ["воз", "ЗОВ", "корсет", "киборг","киборг", "гробик", "костер", "сектор"]; 
var arr2=[]; 

/*function sort(a,b){
	return a-b;
}*/
function clear (arr){
	var arr3=[];
for(var i = 0 ; i<arr.length ; i++){
arr3.push(arr[i].toLowerCase().split(''));
arr3[i].sort();
arr2.push(arr3[i].join('')); 
	}
	var sarr=[]; /* сюда должны записываться уникальные элементы , уже отсортированные */
	
	next: 
	for(var i = 0 ; i<arr.length; i++){
		
		for(var j = 0 ;j<sarr.length ; j++ ){
			if(arr2[i]==sarr[j]) 
				continue next;
			
		}
		sarr.push(arr2[i]); /*если здесь будет записано данное значение то он выведет 3 элемента но отсортированных в алфавитном порядке */
	}
console.log(sarr);
}

clear(arr);
console.log(arr);

["взо", "екорст", "бгикор"]
а в вот этом нет
var arr = ["воз", "ЗОВ", "корсет", "киборг","киборг", "гробик", "костер", "сектор"]; 
var arr2=[]; 

/*function sort(a,b){
	return a-b;
}*/
function clear (arr){
	var arr3=[];
for(var i = 0 ; i<arr.length ; i++){
arr3.push(arr[i].toLowerCase().split(''));
arr3[i].sort();
arr2.push(arr3[i].join('')); 
	}
	var sarr=[]; /* сюда должны записываться уникальные элементы , уже отсортированные */
	
	next: 
	for(var i = 0 ; i<arr.length; i++){
		
		for(var j = 0 ;j<sarr.length ; j++ ){
			if(arr2[i]==sarr[j]) 
				continue next;
			
		}
		sarr.push(arr[i]); /*если здесь будет записано данное значение то он выведет все 8 элементов несмотря на continur next*/
	}
console.log(sarr);
}

clear(arr);
console.log(arr);

["воз", "ЗОВ", "корсет", "киборг", "киборг", "гробик", "костер", "сектор"]

вроде бы когда выполняется continue next цикл не должен в принципе переходить туда , но этого не происходит . Пожалуйста объясните почему происходит так (интересно почему а не только решение ), и направьте на правильный путь , могу решить задачу другим методом но мне конкретно интересно почему происходит именно так , так как обучаюсь и хочу понять , чтобы в будущем не наткнуться на что то аналогичное .
Заранее спасибо !!!!
  • Вопрос задан
  • 281 просмотр
Решения вопроса 2
evgeniy8705
@evgeniy8705
Повелитель вселенной
const arr = ["воз", "киборг", "корсет", "ЗОВ", "гробик", "костер", "сектор"];
const map = new Map();
const result = [];

arr.forEach(item => map.set(item.toLowerCase().split("").sort().join(""), item));

for (let item of map.values()) result.push(item);

console.log(result); // ["ЗОВ", "гробик", "сектор"]
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
arr — исходные строки.
arr2 — сортированные.
Исходные строки, скорее всего, не будут совпадать ни с одной из сортированных — потому arr2[i]==sarr[j] во втором фрагменте, скорее всего, не выполнится.
Я бы поступил таким образом. Сделал бы индексированный список сортированных строк и порядковый массив исходных. Поиск сортированной строки в индексированном списке. Если не обнаружена — сортированную в индексированный, исходную в порядковый.

Что в JS будет индексированным списком — просто не знаю. Вероятно, можно обойтись массивом, присвоив sortedList[arr2[i]] = 1. Вот только как найти то, есть ли?

UPD. Можно также воспользоваться хранилищем «ключ-значение»: ключом будет сортированная строка, значением — исходная. iamevg_ так и поступил. Единственная засада (которая хороша или плоха, в зависимости от задачи) — портит порядок строк.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы