2013-03-26 5 views
0

У меня вопрос о массивах в javascript, используя jquery и joutout нокаутом.Извлечь из массивов общие элементы в javascript

У меня есть эта структура в моем коде:

var MyModel = function(model) { 
    var self = this; 
    self.FirstArray = ko.observableArray(ko.utils.arrayMap(model.FirstArray, function(object){ 
      return new ArrayObj(object); 
    })); 

    /*--here's the code that i need to implement--*/ 
} 

var ArrayObj = function(obj){ 
    var self = this; 
    self.VarX = obj.VarX; 
    self.SeccondArray = ko.observableArray(ko.utils.arrayMap(obj.SeccondArray, function(seccond){ 
     return new Object2(seccond); 
    })); 
} 

var Object2 = function(obj2) { 
    var self = this; 
    self.IdObj2 = obj2.IdObj2; 
    self.Name = obj2.Name; 
} 

Проблема заключается в том, что я нужен другой массив, который зависит от элементов, которые являются общими между массивами Объект2 в SeccondArray.

В примере, его что-то вроде этого:

Array1 = [{IdObj2: 1, Name: "A"}, 
      {IdObj2: 2, Name: "B"}, 
      {IdObj2: 3, Name: "C"}] 

Array2 = [{IdObj2: 1, Name: "A"}, 
      {IdObj2: 3, Name: "C"}] 

Array3 = [{IdObj2: 3, Name: "C"}] 

FirstArray = [{VarX: J, Array1}, 
       {VarX: K, Array2}, 
       {VarX: L, Array3}] 

Так .. массив, что мне нужно, должны иметь:

ResultArray = [{IdObj2: 3, Name: "C"}] 

Поскольку {IdObj2: 2, Name: "C"} это единственное общее между ними.

Надеюсь, вы можете мне помочь.

+0

Я не знаю, почему этот пользователь отредактировал мой вопрос, просто чтобы удалить «Спасибо!» .. я думаю, что переполнение стека заслуживает слишком многого благодаря пользователям, и их не следует удалять .. вот что я об этом думаю. БЛАГОДАРЯ! –

ответ

0

То, что вы ищете, является пересечением. Я использовал библиотеку под названием подчеркивания и использовать отличный объект перекресток я нашел здесь How to use underscore's "intersection" on objects?

вот скрипка с ним работает

http://jsfiddle.net/sujesharukil/vyguB/

_.intersectionObjects = _.intersect = function(array) { 
    var slice = Array.prototype.slice; // added this line as a utility 
    var rest = slice.call(arguments, 1); 
    return _.filter(_.uniq(array), function(item) { 
     return _.every(rest, function(other) { 
     return _.any(other, function(element) { return _.isEqual(element, item); }); 
     }); 
    }); 
    }; 

var Array1 = [{IdObj2: 1, Name: "A"}, 
      {IdObj2: 2, Name: "B"}, 
      {IdObj2: 3, Name: "C"}], 

Array2 = [{IdObj2: 1, Name: "A"}, 
      {IdObj2: 3, Name: "C"}], 

Array3 = [{IdObj2: 3, Name: "C"}]; 

var result = _.intersectionObjects(Array1, Array2, Array3); 

console.log(result); 

Надежда, что помогает.

Cheers!

+0

Это работает с массивами 1, 2 и 3, но что, если у меня есть все значения в одном массиве? этот метод не работает ..:/ –

+0

Я думал, что ваше требование состоит в том, чтобы найти общий из нескольких массивов. Поэтому, если все значения находятся в одном массиве, а остальные пустые, то вы выиграли; t есть пересечение –

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