查找集合中至少有一个匹配的所有对象 属性

Find all Objects in a Collection with at least one matching property

我有一个包含对象的数组。简而言之

    Array =[  
    {id = 1, products='1,2'} //products consist of String with Products Seperates by','
    {id = 2, products='1'}  
    {id = 3, products='3'}  
    {id = 4, products='1,2,3'}
    {id = 5, products='2,3'}
    ...  
    ]
SelectedProd = ['2,3']// consists a String as well seperated by ','

这都显示在Table。我现在正在编写一个过滤器以仅显示通过 MultipleSelect 选择的过滤器。
因此,我想过滤所有至少有一个产品在 products
中的对象 所以我的过滤器正在获取对象和选定的产品

.filter('filterByProd', () => {
          return (objects,prod) => {
            var filtered = [];
            /*
FIlter Array
*/
            return filtered;
          };
        });

如果用户选择 Product = '2,3',它将 return 我的对象 id=1/3/4/5..
如果没有选择 return 也很清楚。 如果可能,使用 lodash,但也接受其他解决方案。
我遇到的问题是函数只是在 lodash 文档中列出,无法阅读我需要的每个人。
目前我卡在

.filter('filterByProd', () => {
  return (items,prod) => {
    var filtered = [];
    filtered = _.filter(items,['products',prod]);
    return filtered;
  };
});  

这只给出了与 '2,3' -> Object = id=5 完全匹配的结果。
我需要一些东西

filtered = findAllWhere(selectedProducts,iterateOverSendObjects(checkProductsOfObjects)+_.ifIsAtLeastOneOfSendProducts))  

从服务器获取此对象后,通过注入包含数组格式的 CSV 的新数组 属性 或将产品完全替换为数组来修改它。在绑定之前,您的最终数组应该类似于以下内容:

[<br> {id = 1, 产品=[1,2]}, {id = 2, 产品=[1]} ... ]

如果有帮助请标记为答案

您可以使用 Array.prototype.filter() with Array.prototype.some() and String.prototype.includes() 筛选项目以搜索字符串中的选定项目:

const findIemsByProducts = (items, selectedProd) => {
  const selected = selectedProd[0].split(','); // convert the selected products to array
  
  return items.filter((item) => // filter the items
    selected.some((productId) => // if at least one of the selected
      item.products.includes(productId) // is in the products string
    ));
}

var items = [  
  {id: 1, products: '1,2'},
  {id: 2, products: '1'},
  {id: 3, products: '3'},  
  {id: 4, products: '1,2,3'},
  {id: 5, products: '2,3'}
];

var SelectedProd = ['2,3'];

var results = findIemsByProducts(items, SelectedProd);

console.log(results);

而 angular 过滤器将是:

.filter('filterByProd', () => (items, selectedProd) => {
  const selected = selectedProd[0].split(','); // convert the selected products to array

  return items.filter((item) => // filter the items
    selected.some((productId) => // if at least one of the selected
      item.products.includes(productId) // is in the products string
    ));
});

您可以使用 lodash 的交集方法来获得您想要的结果。

var a = arr.filter(x => {
    return _.intersection(
             x.products.split(','), SelectedProd[0].split(',')
           ).length > 0;

这是一个有效的内联 fiddle:

var arr = [  
    {id : 1, products:'1,2'}, 
    {id : 2, products:'1'},  
    {id: 3, products:'3'},  
    {id : 4, products:'1,2,3'},
    {id : 5, products:'2,3'}];

var SelectedProd = ['2,3'];

var a = arr.filter(x => {
    return _.intersection(
             x.products.split(','), SelectedProd[0].split(',')).length>0;
});

console.log(a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.js"></script>

解释:

Lodash _.intersection returns 两个数组的交集(如果存在),否则 returns []。我们使用过滤器只过滤那些交集非空的对象