2016-08-18 2 views
0

Я делаю пересечение массива в JavaScript с использованием lodash, ниже приведен код, который я пытаюсь, то, что я получаюКак сделать многомерное пересечение массива с помощью lodash?

["universal", "ola", "uber", "bangalore"], 

Но то, что я ожидал это [ «универсальный»]

Здесь orgArr multidiemensional массив с п числа элементов, я имею в виду, orgArr может иметь 5 или 6, или 10 элементов ... пример

[["garden","canons","philips","universal"],["universal","ola","uber","bangalore"], ["ola","uber","bangalore"]]; 

Это не только с двумя пунктами, пожалуйста, обратите внимание

var orgArr = [["garden","canons","philips","universal"],["universal","ola","uber","bangalore"]]; 
    var resfinaArray = []; 


    for (var i = 0; i < orgArr.length; i++){ 
     var currItem = orgArr[i]; 

     for (var j = 0; j< orgArr.length; j++){ 

     resfinaArray.push(_.intersection(currItem, orgArr[j])); 
     } 
    } 

    console.log(resfinaArray, 'resfinaArray'); 

Любая помощь, пожалуйста?

+0

разве это должно просто «var resfinaArray = _intersection ([« сад »,« каноны »,« philips »,« универсальный »), ['uni versal ',' uber ',' bangalore ']); ' – apieceofbart

+0

@apieceofbart Точно. Циклы 'for' являются избыточными. – undefined

ответ

0

Вы можете сделать это с помощью цикла forEach() и опционного параметра thisArg.

var orgArr = [["garden","canons","philips","universal"],["universal","ola","uber","bangalore"]]; 
 
var resfinaArray = []; 
 

 
orgArr.forEach(function(a) { 
 
    var that = this; 
 
    a.forEach(function(e) { 
 
    (!that[e]) ? that[e] = true : resfinaArray.push(e); 
 
    }) 
 
}, {}); 
 

 
console.log(resfinaArray);

+0

ваш работает только для двух элементов, он должен работать с дополнительными временем, если есть – User123

+0

Не уверен, что вы имеете в виду https://jsfiddle.net/Lg0wyt9u/1140/? –

+0

ваш jsfiddle отлично работает, но все же есть некоторые недостатки. он также нажимает повторяющиеся элементы на resfinaArray. попробуйте этот var orgArr = [[«сад», «каноны», «philips», «универсальные»), [«универсальные», «ola», «uber», «bangalore», «philips»], [bangalore », , "Филипс"], [ "универсальный", "Ola", "убер", "Бангалор"]]; – User123

0

С ES6, вы могли бы использовать Set и Array#reduce.

var array = [["garden", "canons", "philips", "universal"], ["universal", "ola", "uber", "bangalore"], ["abc", "def", "universal"]], 
 
    result = [...array.reduce((r, a, i) => 
 
     a.reduce((s, b) => 
 
      (!i || r.has(b)) && s.add(b) || s, new Set), new Set)]; 
 
    
 
console.log(result);

0

Я хотел бы сделать эту работу следующим образом;

var intersectArrays = a => a.reduce((p,c) => p.filter(e => c.includes(e))), 
 
       arr = [["garden","canons","philips","universal"],["universal","ola","uber","bangalore"], ["ola","uber","bangalore", "universal"]], 
 
       brr = intersectArrays(arr); 
 
console.log(brr);

0

Вам не нужны петли:

var intersection = _.intersection(["garden","canons","philips","universal"],["universal","ola","uber","bangalore"]); 

В случае, если у вас есть данные в массив можно использовать apply:

var intersection = _.intersection.apply(null, [["garden","canons","philips","universal"],["universal","ola","uber","bangalore"]]); 
Смежные вопросы