23.12.2013, 10:39
|
Новичок на форуме
|
|
Регистрация: 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;
}
} |
|
|
23.12.2013, 12:00
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,215
|
|
Сообщение от 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;
};
|
|
23.12.2013, 12:50
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
ksa, то есть при первом же совпадении считаем остальные элементы тоже совпавшими? Странная логика..
__________________
В личку только с интересными предложениями
|
|
23.12.2013, 13:07
|
|
Профессор
|
|
Регистрация: 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;
});
}
;
__________________
В личку только с интересными предложениями
|
|
23.12.2013, 13:09
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от SWin
|
-если длина массива matchArray === длине массива array2 возвращаеться true, иначе false.
|
Зачем вобще тогда наполнять массив matchArray, если он в дальнейшем не используется, а требуется всего лишь длина (количество совпадений)? Может тогда просто считать эти самые совпадения?
__________________
В личку только с интересными предложениями
|
|
23.12.2013, 13:21
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,215
|
|
Сообщение от danik.js
|
Странная логика..
|
Я почему-то решил, что автору достаточно одного совпадения...
Если второй массив должен быть частью первого - тогда все сложнее. Ведь может получиться и такая комбинация
var a1=[1,2,3,4,5];
var a2=[2,4,4,2];
И как тогда?
|
|
23.12.2013, 13:37
|
Новичок на форуме
|
|
Регистрация: 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 еще не добежали.
|
|
23.12.2013, 13:39
|
|
Профессор
|
|
Регистрация: 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;
}
__________________
В личку только с интересными предложениями
|
|
23.12.2013, 13:45
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,215
|
|
Сообщение от 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... Хотя второй массив не часть первого.
|
|
23.12.2013, 13:53
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от ksa
|
Хотя второй массив не часть первого.
|
А что по твоему означает "второй массив" - часть первого?
Я не зря назвал функцию isSubset. В множествах нет повторяющихся элементов, поэтому [2, 4, 4, 2] - тоже самое что и [2, 4], и в множествах порядок не имеет значения. Именно так функция и работает - игнорирует порядок и повторы.
__________________
В личку только с интересными предложениями
|
|
|
|