如何在对象数组中过滤数组?

Tak*_*ebo 1 javascript ecmascript-6 reactjs

我正在尝试通过标签过滤列表:

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']}
   ]
Run Code Online (Sandbox Code Playgroud)

我可以使用和来按名称过滤列表,我的问题是当我尝试按标签列出产品时。我必须在产品过滤器内使用吗?还有另一种方法吗?mapfilterforeach

sja*_*han 11

像那样?

const filter = 'nature';
const filteredResult = initialState.filter((item) => {
    return (item.tags.indexOf(filter) >= 0);
});
Run Code Online (Sandbox Code Playgroud)


Ori*_*ori 5

您可以创建一选定的标签,并用于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);
Run Code Online (Sandbox Code Playgroud)

  • 正是我需要的 (2认同)