如何在我的案例

时间:2016-06-14 20:36:03

标签: javascript arrays

我正在尝试映射两个数组并在我的代码中创建一个全新的数组

我有类似

的东西
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和Ted,如

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

但相反,我得到了

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

我不确定我做错了什么。无论如何我可以改进我的代码更充分吗?非常感谢!

2 个答案:

答案 0 :(得分:1)

您不应该push而是concat,因为您从p获得的filter已经是一个数组。所以改变:

info.push(p)

为:

info = info.concat(p)

其次,您要将字符串与数字进行比较,因此请更改:

var array2 = [1, 2]; 

为:

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

或,将id值更改为数字。以下代码段可以做到这一点,并且使用Array.prototype.indexOf使代码更简洁:

&#13;
&#13;
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);    
&#13;
&#13;
&#13;

答案 1 :(得分: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
        }
    });
}