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

Set a property on an array of objects by an array of filters

假设我有以下数组:

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 循环来做到这一点,但问题是过滤器的顺序在每次迭代中都不匹配,所以并不是所有的标记都可以设置为可见。

在此上下文中尝试使用 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;
}

使用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);

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

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

不需要Array#map() and a superfluous assignment. Just use 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>');