Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.12.2013, 10:39
Новичок на форуме
Отправить личное сообщение для SWin Посмотреть профиль Найти все сообщения от SWin
 
Регистрация: 03.12.2013
Сообщений: 8

Перебор массива - вложенный цикл
Не могу понять где ошибки.
Задача:
необходимо написать функцию, которая проверяла - содержаться ли элементы массива array 2 в массиве array 1 и в зависимости от этого возвращала булевое значение.

Решение (неработающее):
Создаю два цикла:
-внешний цикл перебирает значения array1 и присваивает их var arrayElem, которая передаётся во внутренний цикл;
-во внутреннем цикле перебираются значения array2 и сравниваются с var arrayElem;
-если значения равны то array2[j] помещаеться в пустой массив matchArray;
-если длина массива matchArray === длине массива array2 возвращаеться true, иначе false.

Код:
function contains(array1, array2) {
	"use strict";
	array1 = [1, 2, 3, 4, 5];
	what = [1, 2, 3];
	var matchArray = [];

	for (var i = 0; i < array1.length; i++) {
		var arrayElem = array1[i];
		for (var j = 0; j < what.length; i++) {
			if (what[j] === arrayElem) {
				matchArray.push(what[j]);
			}
		}
	}
	if (matchArray.length === what.length) {
		return true;
	} else {
		return false;
	}
}
Ответить с цитированием
  #2 (permalink)  
Старый 23.12.2013, 12:00
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от SWin
необходимо написать функцию, которая проверяла - содержаться ли элементы массива array 2 в массиве array 1 и в зависимости от этого возвращала булевое значение.
Как вариант...

var a1=[1,2,3,4,5];
var a2=[2,4];
alert(cross(a1,a2));
function cross(Ar1,Ar2) {
	for (var i=0; i<Ar1.length; i++) {
		for (var j=0; j<Ar2.length; j++) {
			if (Ar1[i]==Ar2[j]) {
				return true;
			};
		};
	};
	return false;
};
Ответить с цитированием
  #3 (permalink)  
Старый 23.12.2013, 12:50
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

ksa, то есть при первом же совпадении считаем остальные элементы тоже совпавшими? Странная логика..
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 23.12.2013, 13:07
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Используя ES5 функционал:
var a1 = [1,2,3,4,5];
var a2 = [2,4];

alert(isSubset(a1, a2));

function isSubset(a1, a2) {
    return a2.every(function(element) {
        return a1.indexOf(element) !== -1;
    });
}
;
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 23.12.2013, 13:09
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от SWin
-если длина массива matchArray === длине массива array2 возвращаеться true, иначе false.
Зачем вобще тогда наполнять массив matchArray, если он в дальнейшем не используется, а требуется всего лишь длина (количество совпадений)? Может тогда просто считать эти самые совпадения?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 23.12.2013, 13:21
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от danik.js
Странная логика..
Я почему-то решил, что автору достаточно одного совпадения...
Если второй массив должен быть частью первого - тогда все сложнее. Ведь может получиться и такая комбинация

var a1=[1,2,3,4,5];
var a2=[2,4,4,2];

И как тогда?
Ответить с цитированием
  #7 (permalink)  
Старый 23.12.2013, 13:37
Новичок на форуме
Отправить личное сообщение для SWin Посмотреть профиль Найти все сообщения от SWin
 
Регистрация: 03.12.2013
Сообщений: 8

Сообщение от danik.js Посмотреть сообщение
Зачем вобще тогда наполнять массив matchArray, если он в дальнейшем не используется, а требуется всего лишь длина (количество совпадений)? Может тогда просто считать эти самые совпадения?
Да, так логичнее.
function contains(array1, array2) {
	"use strict";
	array1 = [1, 2, 3, 4, 5];
	what = [1, 2, 3];
	var matchArray = [];
        var counter = 0;

	for (var i = 0; i < array1.length; i++) {
		var arrayElem = array1[i];
		for (var j = 0; j < what.length; i++) {
			if (what[j] === arrayElem) {
				counter = counter + 1;
			}
		}
	}
	if (counter === what.length) {
		return true;
	} else {
		return false;
	}
}

К сожалению, мне как начинающему не совсем понятен Ваш код.

Забыл сказать: я не могу в коде использовать те элементы JS, которые мы ещё не изучали а до indexOf еще не добежали.
Ответить с цитированием
  #8 (permalink)  
Старый 23.12.2013, 13:39
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от ksa
И как тогда?
var a1=[1,2,3,4,5];
var a2=[2,4,4,2];

alert(isSubset(a1, a2));

function isSubset(a1, a2) {
    for (var i = 0; i < a2.length; i++) {
        var element = a2[i];
        var found = false;
        for (var j = 0; j < a1.length; j++) {
            if (a1[j] === element) {
                found = true;
                break;
            }
        }
        if (!found) {
            return false;
        }
    }
    return true;
}
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 23.12.2013, 13:45
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от danik.js Посмотреть сообщение
var a1=[1,2,3,4,5];
var a2=[2,4,4,2];

alert(isSubset(a1, a2));

function isSubset(a1, a2) {
    for (var i = 0; i < a2.length; i++) {
        var element = a2[i];
        var found = false;
        for (var j = 0; j < a1.length; j++) {
            if (a1[j] === element) {
                found = true;
                break;
            }
        }
        if (!found) {
            return false;
        }
    }
    return true;
}
Этот вариант возвращает true... Хотя второй массив не часть первого.
Ответить с цитированием
  #10 (permalink)  
Старый 23.12.2013, 13:53
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от ksa
Хотя второй массив не часть первого.
А что по твоему означает "второй массив" - часть первого?
Я не зря назвал функцию isSubset. В множествах нет повторяющихся элементов, поэтому [2, 4, 4, 2] - тоже самое что и [2, 4], и в множествах порядок не имеет значения. Именно так функция и работает - игнорирует порядок и повторы.
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как подчинить себе цикл wreder jQuery 17 20.11.2013 22:17
Цикл завешивает страницу, помогите Romingood jQuery 5 19.10.2013 14:30
Нужен цикл для создания огромного массива apish Общие вопросы Javascript 2 20.09.2012 16:10
JS Перебор ассоциативного многомерного массива zbs2000 Events/DOM/Window 8 23.07.2012 01:23
Перебор массива объектов Триви jQuery 12 26.08.2011 09:22