2014-10-13 7 views
0

Теперь я пишу javascript, чтобы отфильтровывать массивы, которые содержат определенный подматрица. Конечно, я могу написать функцию самостоятельно, но мне просто интересно, есть ли какая-то встроенная функция в javascript или другой библиотеке javascript для этого, или если есть простой способ сделать это всего несколькими строками.Есть функция, чтобы найти subarray в javascript с повторяющимися элементами?

Я обнаружил, что могу использовать underscore.js, если все элементы в подобласте уникальны. Существует функция пересечения, и я могу проверить длину после пересечения, чтобы увидеть, правильна ли длина. Однако эта функция не работает, если в поддиапазоне повторяются значения.

Например,

_.intersection([1, 2, 3, 4, 5], [2, 1]); 

Это будет возвращать [1, 2], и путем проверки длины я знаю, этот массив содержит вспомогательный массив.

Однако, когда повторяются значения в суб-массиве,

_.intersection([1, 1, 2, 3, 4, 7, 10], [1, 1, 2]); 
_.intersection([1, 2, 3, 4], [1, 1, 2]); 

Оба будут возвращаться [1, 2] и случаи нельзя отличить.

Есть ли еще встроенная функция, которую я могу использовать или есть простой способ сделать работу в нескольких строках?

+0

без (V) { \t возврата this.indexOf (v) == = -1; }, [1, 1, 2, 3, 4, 7, 10]). Length == 0; – dandavis

+0

Этот метод приведет к той же ошибке, если используются [1,2,3,4] и [1,1,2]. – cytsunny

+0

[1, 1, 2] и [1, 2] оба выдают true, есть ли требование, которое мне не хватает? – dandavis

ответ

1

Попробуйте это:

function contains(a, b) { 
    // sort arguments 
    if(a.length < b.length) { 
     var temp = a; 
     a = b; 
     b = temp; 
    } 
    // copy array 
    a = a.slice(); 
    return b.every(function(elm) { 
     var index = a.indexOf(elm); 
     if(index !== -1) { 
      // remove the found element 
      a.splice(index, 1); 
      return true; 
     } 
     return false; 
    }); 
} 

console.log(contains([1, 1, 2], [1, 2, 3, 4, 7, 10])); // logs false 
console.log(contains([1, 1, 2], [1, 1, 2, 3, 4, 7, 10])); // logs true 
console.log(contains([1, 2, 3, 4, 7, 10], [1, 1, 2])); // logs false 
console.log(contains([1, 1, 2, 3, 4, 7, 10], [1, 1, 2])); // logs true 

Здесь [1, 1, 2] .filter (функция demo

+0

Спасибо. Это рабочий метод и, по крайней мере, короче того, который я написал сам. Тем не менее, я хочу посмотреть, есть ли более быстрый метод. Будут повышены и отмечены как правильные, если в течение этих нескольких дней нет других лучших ответов. – cytsunny

Смежные вопросы