2012-03-17 11 views
0

Таким образом, название говорит большинство из них, и я приведу пример:Сравнить строковые элементы массива объекта элементов свойство другого массива

var foo = ['one', 'two', 'three']; 
var bar = [ 
     { 
      integer: 1, 
      string: 'one' 
     }, 
     { 
      integer: 3, 
      string: 'three' 
     }  
    ]; 

Теперь я задаюсь вопросом, как я могу получить список положительных совпадений для каждого из элементов в foo против каждого из свойств string всех объектов в массиве bar.

ответ

4

Во-первых, сделать множество всех элементов в foo, чтобы избежать квадратное сложности:

var fooSet = {};  
for(var i = 0; i < foo.length; i++) { 
    var e = foo[i]; 
    fooSet[e] = true; 
} 

Затем пройти через bar и собирать спички:

var matches = []; 
for(var i = 0; i < bar.length; i++) { 
    var e = bar[i]; 
    if(fooSet[e.string]) { 
      matches.push(e); 
    } 
} 

После этого matches массив будет содержать элементы от bar, которые соответствуют элементам foo.

Вот живой пример:

+0

+1. Создание 'fooSet' делает это лучше, чем мой ответ, который использовал' .indexOf() '(особенно теперь, когда вы удалили циклы for..in). – nnnnnn

+0

Правда, но это работает только в том случае, если длины foo и bar равны, что не в моей usecase. Вот почему я привел такой пример. http://jsfiddle.net/mfAc4/ – Milos

+1

Он отлично работает для разных длин 'foo' и' bar' - вот пример, где 'foo' имеет 8 и' bar' имеет 3 элемента: http://jsfiddle.net/mfAc4/1/и вот пример, где 'foo' имеет 2 и' bar' имеет 3 элемента: http://jsfiddle.net/mfAc4/2/. Это то, что вы ищите? –

0

Петля через один из массивов проверки каждого элемента против другого:

var matches = [], 
    i, j; 

for (i=0; i < bar.length; i++) 
    if (-1 != (j = foo.indexOf(bar[i].string))) 
     matches.push(foo[j]); 

// matches is ['one', 'three'] 

Очевидно, что если вы хотите matches, чтобы содержать предметы от bar, а не foo просто измените .push() s до matches.push(bar[i]);.

Конечно, предполагается, что вы не заботитесь о поддержке старых браузеров, которые не делают .indexOf() на массивах, или что вы можете использовать a shim.

0

Это:

// foo & bar defined here 

// put all the keys from the foo array to match on in a dictionary (object) 
var matchSet = {}; 
for (var item in foo) 
{ 
    var val = foo[item]; 
    matchSet[val] = 1; 
} 

// loop through the items in the bar array and see if the string prop is in the matchSet 
// if so, add it to the matches array 
var matches = []; 
for (var i=0; i < bar.length; i++) 
{ 
    var item = bar[i]; 
    if (matchSet.hasOwnProperty(item['string'])) 
    { 
     matches.push(item['string']); 
    } 
} 

// output the matches (using node to output to console) 
for (var i in matches) 
{ 
    console.log(matches[i]); 
} 

Выходы:

match: one 
match: three 

Примечание: с помощью узла для запуска в интерактивном режиме

0

Эти 2 работы. Зависит от того, как вы хотите использовать данные, которые вы можете изменить.

http://jsfiddle.net/KxgQW/5/

ПУТЬ ОДИН

//wasn't sure which one you want to utilize so I'm doing both 
//storing the index of foo to refer to the array 
var wayOneArrayFOO= Array(); 
//storing the index of bar to refer to the array 
var wayOneArrayBAR= Array(); 

var fooLength = foo.length; 
var barLength = bar.length; 


/*THE MAGIC*/     
//loop through foo 
for(i=0;i<fooLength;i++){ 

    //while your looping through foo loop through bar   
    for(j=0;j<barLength;j++){ 
     if(foo[i]==bar[j].string){ 
      wayOneArrayFOO.push(i); 
      wayOneArrayBAR.push(j);  
     } 
    } 

} 

ПУТЬ ДВА

//storing the value of foo 
var wayTwoArrayFOO= Array(); 
//storing the value of bar 
var wayTwoArrayBAR= Array();    


/*THE MAGIC*/  
//loop through foo 
for(i=0;i<fooLength;i++){ 

    //while your looping through foo loop through bar   
    for(j=0;j<barLength;j++){ 
     if(foo[i]==bar[j].string){ 
      wayTwoArrayFOO.push(foo[i]); 
      wayTwoArrayBAR.push(bar[j]);  
     } 
    } 

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