优化嵌套循环以从数组中过滤包含特定值的对象
Refine nested loop to filter objects containing certain value, from array
在 JavaScript 中,我有一个对象数组:
var allAliases = [
{ "name": "Cards", "alias": "cards", "view": "/path/cards/" },
{ "name": "Carousel", "alias": "carousel", "view": "/path/carousel/" },
{ "name": "Image boxes", "alias": "imageBoxes", "view": "/path/imageBoxes/" },
{ "name": "Gallery", "alias": "gallery", "view": "/path/gallery/" },
{ "name": "Slide panels", "alias": "slidePanels", "view": "/path/slide-panels/" }
]
然后我有一个别名的字符串数组,如下所示:
var aliases = 'cards,carousel,gallery';
var permittedAliases = aliases.split(',');
我需要过滤原始数组,以便只剩下别名值匹配的对象和 permittedAliases
数组中的字符串。所以在上面的例子中我会剩下:
[
{ "name": "Cards", "alias": "cards", "view": "/path/cards/" },
{ "name": "Carousel", "alias": "carousel", "view": "/path/carousel/" },
{ "name": "Gallery", "alias": "gallery", "view": "/path/gallery/" }
]
我可以通过创建一个新数组、遍历原始数组、比较值并将匹配的对象添加到新数组来做到这一点,如下所示:
var filteredArray = [];
for (var i = 0; i < allAliases.length; i++) {
for (j = 0; j < permittedAliases.length; j++) {
if (allAliases[i].alias === permittedAliases[j]) {
filteredArray.push(allAliases[i]);
}
}
}
虽然我觉得这很笨拙,循环中循环。我想知道是否有更简洁的方法来做到这一点?
约束是需要ES5.1可惜
非常感谢。
您可以使用 Array#filter
and Array#some
过滤数组作为别名。
var allAliases = [{ "name": "Cards", "alias": "cards", "view": "/path/cards/" }, { "name": "Carousel", "alias": "carousel", "view": "/path/carousel/" }, { "name": "Image boxes", "alias": "imageBoxes", "view": "/path/imageBoxes/" }, { "name": "Gallery", "alias": "gallery", "view": "/path/gallery/" }, { "name": "Slide panels", "alias": "slidePanels", "view": "/path/slide-panels/" }],
aliases = 'cards,carousel,gallery',
permittedAliases = aliases.split(','),
filtered = allAliases.filter(function (o) {
return permittedAliases.some(function (a) {
return o.alias === a;
});
});
console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }
或者您可以使用 Array#indexOf
,而不是 Array#some
var allAliases = [{ "name": "Cards", "alias": "cards", "view": "/path/cards/" }, { "name": "Carousel", "alias": "carousel", "view": "/path/carousel/" }, { "name": "Image boxes", "alias": "imageBoxes", "view": "/path/imageBoxes/" }, { "name": "Gallery", "alias": "gallery", "view": "/path/gallery/" }, { "name": "Slide panels", "alias": "slidePanels", "view": "/path/slide-panels/" }],
aliases = 'cards,carousel,gallery',
permittedAliases = aliases.split(','),
filtered = allAliases.filter(function (o) {
return permittedAliases.indexOf(o.alias) !== -1;
});
console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }
在 JavaScript 中,我有一个对象数组:
var allAliases = [
{ "name": "Cards", "alias": "cards", "view": "/path/cards/" },
{ "name": "Carousel", "alias": "carousel", "view": "/path/carousel/" },
{ "name": "Image boxes", "alias": "imageBoxes", "view": "/path/imageBoxes/" },
{ "name": "Gallery", "alias": "gallery", "view": "/path/gallery/" },
{ "name": "Slide panels", "alias": "slidePanels", "view": "/path/slide-panels/" }
]
然后我有一个别名的字符串数组,如下所示:
var aliases = 'cards,carousel,gallery';
var permittedAliases = aliases.split(',');
我需要过滤原始数组,以便只剩下别名值匹配的对象和 permittedAliases
数组中的字符串。所以在上面的例子中我会剩下:
[
{ "name": "Cards", "alias": "cards", "view": "/path/cards/" },
{ "name": "Carousel", "alias": "carousel", "view": "/path/carousel/" },
{ "name": "Gallery", "alias": "gallery", "view": "/path/gallery/" }
]
我可以通过创建一个新数组、遍历原始数组、比较值并将匹配的对象添加到新数组来做到这一点,如下所示:
var filteredArray = [];
for (var i = 0; i < allAliases.length; i++) {
for (j = 0; j < permittedAliases.length; j++) {
if (allAliases[i].alias === permittedAliases[j]) {
filteredArray.push(allAliases[i]);
}
}
}
虽然我觉得这很笨拙,循环中循环。我想知道是否有更简洁的方法来做到这一点?
约束是需要ES5.1可惜
非常感谢。
您可以使用 Array#filter
and Array#some
过滤数组作为别名。
var allAliases = [{ "name": "Cards", "alias": "cards", "view": "/path/cards/" }, { "name": "Carousel", "alias": "carousel", "view": "/path/carousel/" }, { "name": "Image boxes", "alias": "imageBoxes", "view": "/path/imageBoxes/" }, { "name": "Gallery", "alias": "gallery", "view": "/path/gallery/" }, { "name": "Slide panels", "alias": "slidePanels", "view": "/path/slide-panels/" }],
aliases = 'cards,carousel,gallery',
permittedAliases = aliases.split(','),
filtered = allAliases.filter(function (o) {
return permittedAliases.some(function (a) {
return o.alias === a;
});
});
console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }
或者您可以使用 Array#indexOf
,而不是 Array#some
var allAliases = [{ "name": "Cards", "alias": "cards", "view": "/path/cards/" }, { "name": "Carousel", "alias": "carousel", "view": "/path/carousel/" }, { "name": "Image boxes", "alias": "imageBoxes", "view": "/path/imageBoxes/" }, { "name": "Gallery", "alias": "gallery", "view": "/path/gallery/" }, { "name": "Slide panels", "alias": "slidePanels", "view": "/path/slide-panels/" }],
aliases = 'cards,carousel,gallery',
permittedAliases = aliases.split(','),
filtered = allAliases.filter(function (o) {
return permittedAliases.indexOf(o.alias) !== -1;
});
console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }