Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Перебор массива - вложенный цикл (https://javascript.ru/forum/misc/43832-perebor-massiva-vlozhennyjj-cikl.html)

ksa 23.12.2013 13:55

Цитата:

Сообщение от danik.js
А что по твоему означает "второй массив" - часть первого?

Это обычное понятие "быть частью чего-либо"... Т.е. это не какое-то мое понятие... Это понятие вообще.

Например в первом массиве нет двух 2, как и двух 4... Т.о. второй массив ну никак не может быть частью первого.

ksa 23.12.2013 13:56

Цитата:

Сообщение от danik.js
Именно так функция и работает - игнорирует порядок и повторы.

Это-то понятно... :D

danik.js 23.12.2013 14:07

ksa, тогда предлагаю такой вариант:
Сначала отсортировать a2, далее при переборе хранить найденный индекс совпадающего элемента в a1, сверять текущий элемент с предыдущим элементом, и если они равны, то искать дубль уже с сохраненного индекса, а не с начала.

Vlasenko Fedor 23.12.2013 14:08

var a1 = [1, 2, 3, 4, 5];
      var a2 = [2, 4, 4, 2];
      var buf = {},
        rez = false,
        i;
      for (i = 0; i < a2.length; i++) {
        buf[a2[i]] = true;
      }
      for (i = 0; i < a1.length; i++) {
        if (buf[a1[i]]) {
          rez = true;
          break;
        }
      }
      alert(rez);

то же самое http://javascript.ru/forum/misc/4366...ny-stroki.html

ksa 23.12.2013 14:08

Цитата:

Сообщение от danik.js
тогда предлагаю такой вариант ...

Это пусть уже автор думает, что ему делать... :D

ksa 23.12.2013 14:11

Цитата:

Сообщение от Poznakomlus (Сообщение 288571)
var a1 = [1, 2, 3, 4, 5];
      var a2 = [2, 4, 4, 2];
      var buf = {},
        rez = false,
        i;
      for (i = 0; i < a2.length; i++) {
        buf[a2[i]] = true;
      }
      for (i = 0; i < a1.length; i++) {
        if (buf[a1[i]]) {
          rez = true;
          break;
        }
      }
      alert(rez);

то же самое http://javascript.ru/forum/misc/4366...ny-stroki.html

Твой вариант не пройдет, по описаным выше причинам... :no:

ksa 23.12.2013 14:16

Цитата:

Сообщение от danik.js
Сначала отсортировать a2, далее при переборе хранить найденный индекс совпадающего элемента в a1, сверять текущий элемент с предыдущим элементом, и если они равны, то искать дубль уже с сохраненного индекса, а не с начала.

А как тебе такой вариант:
- переделать первый массив в объект (o[a[i]]=<количество_елементов>)
- пройтись по второму массиву проверяя и "минусуя" количество
- если проверка и декремент не выявил патологии - таки является частью.
Т.о. 1 проход по первому и 1 проход по второму - вроде не так уж и плохо получится... :)

ksa 23.12.2013 14:26

Цитата:

Сообщение от Poznakomlus
мой пример является решением, этой задачи.

Нет. :no:
Цитата:

Сообщение от Poznakomlus
Не кажется, что вы усложняете задачу не описанную Т.С.

Нет. :no:

Т.к. массив
var a2 = [2, 4, 4, 2];

не является частью массива
var a1 = [1, 2, 3, 4, 5];

Vlasenko Fedor 23.12.2013 14:32

что вы считаете частью массива?
не нашел у Т. С. такого
a2 [2, 3] ?
a3 [3, 2] ?
a4 [3] ?
массива a1 = [1, 2, 3, 4, 5];

ksa 23.12.2013 14:41

Цитата:

Сообщение от Poznakomlus
что вы считаете частью массива?

Дабы не повторяться...
http://javascript.ru/forum/misc/4383...tml#post288560

Цитата:

Сообщение от Poznakomlus
не нашел у Т. С. такого

Ну не нашел - так не нашел... :D

Вот мой вариант на проверку именно части одного массива в другом

var a1 = [1, 2, 3, 4, 5];
var a2 = [2, 4, 4, 2];
alert(part(a1,a2));
a2 = [2, 4];
alert(part(a1,a2));
function part(Ar1,Ar2) {
	var o={};
	for (var i=0; i<Ar1.length; i++) {
		o[Ar1[i]]=(o[Ar1[i]]||0)+1;
	};
	for (i=0; i<Ar2.length; i++) {
		if (o[Ar2[i]]) {
			if (o[Ar2[i]]--==0) {
				return false;
			};
		} else {
			return false;
		}; 
	};
	return true;
};


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