我尝试按标记:
过滤列表const initialState = [
{id:1 ,name: 'Product A', image: 'pic-001.jpg', tags: ['nature', 'camping', 'outdoor']},
{id:2 ,name: 'Product B', image: 'pic-002.jpg', tags: ['winter', 'hiking', 'camping', 'snow']},
{id:3 ,name: 'Product C', image: 'pic-003.jpg', tags: ['vacation', 'family', 'kids', 'river', 'lake', 'fishing']}
]
我可以使用map
和filter
按名称过滤列表,我的问题是当我尝试按标签列出产品时。我是否必须在我的产品过滤器中使用foreach
?还有另一种方法吗?
答案 0 :(得分:4)
您可以创建Set个所选标记,并使用Array#some
检查对象中是否至少有一个标记存在于对象中。标签列表:
const initialState = [
{id:1 ,name: 'Product A', image: 'pic-001.jpg', tags: ['nature', 'camping', 'outdoor']},
{id:2 ,name: 'Product B', image: 'pic-002.jpg', tags: ['winter', 'hiking', 'camping', 'snow']},
{id:3 ,name: 'Product C', image: 'pic-003.jpg', tags: ['vacation', 'family', 'kids', 'river', 'lake', 'fishing']}
];
const filterByTags = ['nature', 'family'];
const filterByTagSet = new Set(filterByTags);
const result = initialState.filter((o) =>
o.tags.some((tag) => filterByTagSet.has(tag))
);
console.log(result);

答案 1 :(得分:2)
喜欢那个?
const filter = 'nature';
const filteredResult = initialState.filter((item) => {
return (item.tags.indexOf(filter) >= 0);
});
答案 2 :(得分:0)
你可以使用indexOf函数
var foo = initialState.filter(function(elm){
return elm.tags.indexOf("camping")>=0
});
答案 3 :(得分:0)
首先获取所有标签并从initialState过滤重复的标签。将数组保存为uniqueTags。
然后将uniqueTags与initialState名称进行比较,以创建另一个包含对象及其属性标签和产品的数组productTags。
const initialState = [
{id:1 ,name: 'Product A', image: 'pic-001.jpg', tags: ['nature', 'camping', 'winter', 'outdoor']},
{id:2 ,name: 'Product B', image: 'pic-002.jpg', tags: ['winter', 'hiking', 'family', 'camping', 'snow']},
{id:3 ,name: 'Product C', image: 'pic-003.jpg', tags: ['vacation', 'family', 'kids', 'river', 'lake', 'fishing']}
]
let allTags = [];
initialState.map((t)=>t.tags).forEach((a)=>a.forEach((b)=>allTags.push(b)))
let uniqueTags = allTags.filter((a,i,arr)=>arr.indexOf(a,i+1)===-1)
productTags = [];
uniqueTags.forEach((u)=>{
initialState.forEach((t)=>{
if(t.tags.includes(u))
productTags.push({'tag': u, 'product':t.name});
})
})
console.log(JSON.stringify(productTags));
/*
[
{ "tag": "nature", "product": "Product A" },
{ "tag": "outdoor", "product": "Product A" },
{ "tag": "winter", "product": "Product A" },
{ "tag": "winter", "product": "Product B" },
{ "tag": "hiking", "product": "Product B" },
{ "tag": "camping", "product": "Product A" },
{ "tag": "camping", "product": "Product B" },
{ "tag": "snow", "product": "Product B" },
{ "tag": "vacation", "product": "Product C" },
{ "tag": "family", "product": "Product B" },
{ "tag": "family", "product": "Product C" },
{ "tag": "kids", "product": "Product C" },
{ "tag": "river", "product": "Product C" },
{ "tag": "lake", "product": "Product C" },
{ "tag": "fishing", "product": "Product C" }
] */
要形成正确的对象,我已将代码更改为:
const initialState = [
{id:1 ,name: 'Product A', image: 'pic-001.jpg', tags: ['nature', 'camping', 'winter', 'outdoor']},
{id:2 ,name: 'Product B', image: 'pic-002.jpg', tags: ['winter', 'hiking', 'family', 'camping', 'snow']},
{id:3 ,name: 'Product C', image: 'pic-003.jpg', tags: ['vacation', 'family', 'kids', 'river', 'lake', 'fishing']}
]
let allTags = [];
initialState.map((t)=>t.tags).forEach((a)=>a.forEach((b)=>allTags.push(b)))
let uniqueTags = allTags.filter((a,i,arr)=>!arr.includes(a,i+1))
productTags = [];
uniqueTags.forEach((u)=>{
let productName = [];
initialState.forEach((t)=>{
if(t.tags.includes(u))
productName.push(t.name);
})
productTags.push({tag:u, products:productName});
})
console.log(JSON.stringify(productTags));
/*
productTags = [
{"tag":"nature","products":["Product A"]},
{"tag":"outdoor","products":["Product A"]},
{"tag":"winter","products":["Product A","Product B"]},
{"tag":"hiking","products":["Product B"]},
{"tag":"camping","products":["Product A","Product B"]},
{"tag":"snow","products":["Product B"]},
{"tag":"vacation","products":["Product C"]},
{"tag":"family","products":["Product B","Product C"]},
{"tag":"kids","products":["Product C"]},
{"tag":"river","products":["Product C"]},
{"tag":"lake","products":["Product C"]},
{"tag":"fishing","products":["Product C"]}
]
*/