查找集合中至少有一个匹配的所有对象 属性
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 []。我们使用过滤器只过滤那些交集非空的对象
我有一个包含对象的数组。简而言之
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 []。我们使用过滤器只过滤那些交集非空的对象