优化嵌套循环以从数组中过滤包含特定值的对象

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; }