Return Object in Array if 属性 匹配

Return Object in Array if Property Match

场景如下:

手头的任务:

这是我正在做的事情:

function SelectedProducts(listOfSelectedProductIds){
    for (var index = 0; index < listOfSelectedProductIds.length; index++) {
        var currentItem = listOfSelectedProductIds[index];

        var desiredProduct = _.contains(listOfAllPossibleProducts, currentItem);

        if (desiredProduct === true) {
            return listOfAllPossibleProducts[index];
        }
    }
}

当前情况:

问题:

如何使用_.filter:

var result = _.filter(listOfAllPossibleProducts, function (el) {
  return _.contains(listOfSelectedProductIds, el.id);
});

或者非下划线方式:

var result = listOfAllPossibleProducts.filter(function (el) {
  return listOfSelectedProductIds.indexOf(el.id) > -1;
});

DEMO

创建另一个结构productsByProductId 一次!

var productsByProductId = {};
listOfAllPossibleProducts.forEach(p => {
    productsByProductId[p.ProductId()] = p
});

也许还有一个辅助函数

function getProductById(id){
    return productsByProductId[id];
}

并使用它来将 ID 映射到节点

var selectedProducts = listOfSelectedProductIds.map(getProductById)