我们说我有以下数组:
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循环进行此操作,但问题是过滤器的顺序在每次迭代期间都不匹配,因此并非所有标记都可以设置为可见。
答案 0 :(得分:2)
尝试在此背景下使用Array.prototype.map()
,
markers = markers.map(function(itm){
return (itm.visible = (filters.indexOf(itm.markerId) > -1) , itm)
});
或者您可以使用简单的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;
});