我有一个带对象的数组。简而言之
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))
答案 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;
说明:
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}}过滤项目,以搜索字符串中的所选项目:
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;
角度滤波器将是:
.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
));
});