2016-06-14 58 views
-2

我試圖映射兩個數組,在我的代碼創建一個全新的陣列如何在我的情況下,兩個陣列映射

我有類似

var array1 =[ 
    {'name':'John' 
    'id': '1'}, 
    {'name':'Ted' 
    'id': '2'}, 
    {'name':'KK' 
    'id': '3'} 
]; 
var array2 =[1, 2]; 

var info = [];  

for (var i = 0; i <array2.length; i++){ 
    var id = array2[i]; 
    var p = array1.filter(function(person){ 
      return id === person.id 
    }) 

    info.push(p) 
} 

我想我info數組包含John和泰德喜歡

[ 
    {'name':'John' 
    'id': '1'}, 
    {'name':'Ted' 
    'id': '2'} 
] 

,而是,我

[ 
    [ 
     {'name':'John' 
     'id': '1'} 
    ], 
    [ 
     {'name':'Ted' 
     'id': '2'} 
    ] 
] 

我不知道我做錯了什麼。無論如何,我可以改進我的代碼,以便更充分?非常感謝!

+0

您應該修復花式引號 – j08691

+0

您的代碼是從內到外的。在'filter'內循環'array2',或者更好地使用'indexOf'或'some'。 – 1983

回答

1

您不應該爲push而是concat,因爲您從filter獲得的p已經是一個數組。所以改變:

info.push(p) 

到:

info = info.concat(p) 

其次,你是比較有數字的字符串,所以更改:

var array2 = [1, 2]; 

到:

var array2 = ['1', '2']; 

,或者改變值爲id數字。下面的代碼片段這樣做,而且也使代碼與使用Array.prototype.indexOf更簡潔:

var array1 =[ 
 
    {'name':'John', 'id': 1}, 
 
    {'name':'Ted', 'id': 2}, 
 
    {'name':'KK', 'id': 3} 
 
]; 
 
var array2 = [1, 2]; 
 
var info = array1.filter(function (person) { 
 
    return array2.indexOf(person.id) !== -1; 
 
}); 
 
console.log(info);

+0

感謝但concat似乎並沒有這樣做。信息變成空陣列後,我將其更改爲concat +1 tho – FlyingCat

+0

將'return id === person.id'更改爲'return id == person.id' – AbM

+0

@abM仍然不起作用 – FlyingCat

1

你推p,但不是每個人對象的info陣列。另外,你有語法錯誤。 @trincot答案中提到了一些其他編碼錯誤。

var array1 =[ 
    {name: 'John', id: 1}, 
    {name: 'Ted', id: 2}, 
    {name: 'KK', id: 3} 
], array2 = [1, 2]; 

var info = []; 
for (var i = 0, b = array2.length; i < b; i++) { 
    var id = array2[i]; 
    array1.filter(function(person) { 
     if(id === person.id) { 
      info.push(person); 
      return true; // breaks the filter 
     } 
    }); 
} 
相關問題