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

时间:2016-10-14 14:10:59

标签: angularjs underscore.js lodash angular-filters

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

    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 ','

这些都显示在表格中。我现在写一个过滤器,只显示通过MultipleSelect选择的那些 因此,我希望过滤所有至少有一个产品位于products的对象 所以我的过滤器正在获取对象和所选产品

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

如果用户选择Product = '2,3',它将返回带有id=1/3/4/5..的对象 如果没有选择任何返回所有。 如果可能的话,使用lodash,但也接受其他解决方案 我遇到的问题是函数只是在lodash Docu中列出,并且无法读取我需要的所有人 目前,我陷入了

.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))  

3 个答案:

答案 0 :(得分:1)

您可以使用lodash的交叉方法来获得所需的结果。

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

这是一个有效的内联小提琴:



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>
&#13;
&#13;
&#13;

说明:

Lodash _.intersection返回两个数组的交集(如果存在),否则返回[]。我们使用过滤器仅过滤交叉点非空的对象

答案 1 :(得分:0)

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

[
{id = 1, products=[1,2]}, {id = 2, products=[1]} ... ]

如果有帮助,请标记为答案

答案 2 :(得分:0)

您可以使用Array.prototype.filter() Array.prototype.some()String.prototype.includes()使用{{3}}过滤项目,以搜索字符串中的所选项目:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

角度滤波器将是:

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