3

Есть задание:
Дописать функцию contains(where, what). Если все элементы массива what содержатся в массиве where, функция должна возвращать true. Пустой массив является подмножеством любого массива. Порядок вхождения элементов в массив не имеет значения. Примеры:

contains([1,2,3], [3,2]); // true

Не знаю, правильно или, может, даже криво, но я его реализовал. При вызове функция выдает значение тру, но компилятор ругается, пишет:

Замечание: Не возвращает true при подобном вызове: contains([{}], [])

Вот мой код:

//Проверить является ли один массив подмножеством второго
//Дописать функцию contains(where, what). Если все элементы массива what содержатся в массиве where,
// функция должна возвращать true. Пустой массив является подмножеством любого массива. Порядок вхождения 
//элементов в массив не имеет значения. Примеры:
var where = [4, 3, 1, 2, 5, 6, ];
var what = [3, 4, 11];

function contains(where, what) {
    var n = 0;
    var x = 0;
    for (var j = 0; j < what.length; j++) {

        for (var i = 0; i < where.length; i++) {

            if (where[i] == what[j]) {
                n++;
            }
            if (n == what.length)
                x = Boolean(true);
            else
                x = Boolean(false);

        }
    }

    console.log("n length", n);
    console.log("what.length", what.length);
    console.log("n", n);

    return x;
}
contains(where, what);
3
  • 1
    x = Boolean(true); - зачем так извращаться? можно просто x = true;
    – mountpoint
    22 ноя 2014 в 15:34
  • @mountpoint, @Yres Boolean(true) действительно ошибка, т.к. сама идея подобного кода исходит из того, что true может быть переопределен, надо !0 (вариант - Boolean(1)), например, или !1 вариант - Boolean(0)), btw, true,false и undefined не могут быть переопределены в современных браузерах.
    – zb'
    22 ноя 2014 в 18:41
  • @Yres, Если вам дан исчерпывающий ответ, отметьте его как верный (нажмите на галку рядом с выбранным ответом). 19 янв 2015 в 8:04

4 ответа 4

5

А чем такой вариант не устроил?

function contains(where, what){
    for(var i=0; i<what.length; i++){
        if(where.indexOf(what[i]) == -1) return false;
    }
    return true;
}
3

Давайте начнем с рассмотрения задачи. У нас есть три условия:

  • Функция возвращает true при поиске пустого массива
  • Функция возвращает true, если найдены все элементы искомого массива, иначе false
  • (выводится из предыдущего) Функция возвращает false, если хотя бы один элемент не найден

Задачка простая, поэтому можно втупую перенести это в код

function contains(where, what) {
    if (!what) { // условие #1
        return true;
    }
    for (var i = 0; i < what.length; i++) {
        for (var j = 0; j < where.length; j++) {
             if (what[i] == where[j]) { // вообще есть indexOf, но непонятно, под какие платформы это пишется, так что по старинке
                 break;
             }
             if (j === where.length - 1) {
                 // мы дошли до конца массива, и так и не нашли вхождение - значит, у нас есть элемент, который не входит в where, и нужно вернуть false
                 return false;
             }
        }
    }
    // ни для одного из элементов не сработал return false, а значит, все они найдены
    return true;
}
1
  • @Etki Можете показать метод с indexOf?
    – user26238
    12 дек 2014 в 20:21
3
function www(str){
    return arr=['q','e','r','s']
        .every((e)=>str.includes(e));
}
0
    let o,l,m,s;
    o = {'первый ключ':'первая фраза', 'второй ключ':'вторая фраза', 'третий ключ':'третья фраза'};
    l = ['этот текст содержит первый ключ', 'третий ключ находится здесь', 'другого места, чтобы вставить второй ключ, я не нашел'];
    for(m in l){
        for(s in o){
            if(l[m].indexOf(s) != -1){
                console.info(s + ' :: ' + o[s] + ' :: ' + l[m]);
            }
        }
    }
    // в одну строку
        for(m in l) for(s in o) if(l[m].indexOf(s) != -1) console.info(s + ' :: ' + o[s] + ' :: ' + l[m]);

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.