通过一组过滤器在对象数组上设置属性

时间:2016-03-24 19:25:45

标签: javascript arrays google-maps-api-3 javascript-objects

我们说我有以下数组:

var filters = ["id-12", "id-13", "id-50"];

然后是一个数组对象:

var markers = [
{
  markerId: 'id-12',
  visible: true,
},
{
  markerId: 'id-13',
  visible: true,
},
{
  markerId: 'id-50',
  visible: true,
},
{
  markerId: 'id-132',
  visible: true,
},
{
  markerId: 'id-1512',
  visible: true,
}
];

我希望根据过滤器数组中的内容将每个对象的属性设置为true,将其他属性设置为false,当它们与过滤器不匹配时。

我尝试使用简单的for循环进行此操作,但问题是过滤器的顺序在每次迭代期间都不匹配,因此并非所有标记都可以设置为可见。

4 个答案:

答案 0 :(得分:2)

尝试在此背景下使用Array.prototype.map()

markers = markers.map(function(itm){
  return  (itm.visible = (filters.indexOf(itm.markerId) > -1) , itm)
});

DEMO

或者您可以使用简单的for循环

for(var i=0; i<markers.length; i++) {
  markers[i].visible = filters.indexOf(markers[i].markerId) > -1;
}

答案 1 :(得分:2)

使用map功能

var filters = ["id-12", "id-13", "id-50"];

var markers = [ { markerId: 'id-12', visible: true, }, { markerId: 'id-13', visible: true, }, { markerId: 'id-50', visible: true, }, { markerId: 'id-132', visible: true, }, { markerId: 'id-1512', visible: true, } ];

markers = markers.map(function(e) {
    if (filters.indexOf(e.markerId) > -1)
        e.visible = true;
    else
        e.visible = false;
    return e;
});

document.write('<pre>' + JSON.stringify(markers, 0, 2) + '</pre>');

forEach功能ES2015标准

markers.forEach(e => e.visible = filters.indexOf(e.markerId) > -1);

答案 2 :(得分:2)

不需要Array#map()和多余的作业。只需使用Array#forEach()

var markers = [{ markerId: 'id-12', visible: true, }, { markerId: 'id-13', visible: true, }, { markerId: 'id-50', visible: true, }, { markerId: 'id-132', visible: true, }, { markerId: 'id-1512', visible: true, }],
    filters = ["id-12", "id-13", "id-50"];

markers.forEach(function (a) {
    a.visible = !!~filters.indexOf(a.markerId);
});

document.write('<pre>' + JSON.stringify(markers, 0, 4) + '</pre>');

答案 3 :(得分:1)

您想对map中的每个元素使用markers,并设置markerId数组中filters是否可见:

markers = markers.map(function(m) {
  m.visible = filters.indexOf(m.markerId) > -1;
  return m;
});