我有两个数组,一个带有书籍的现有标签,另一个带有按要添加的标签的用户输入值的搜索结果,我需要显示要添加的用户标签中尚不存在的标签:
tags = [{id:1, name:'x'},{id:2, name:'y'},{id:5, name:'z'}]
search = [{id:2, name:'y'},{id:5, name:'z'},{id:15, name:'s'}]
如何创建一个新数组,其中包含标签数组中不存在的搜索 ID 和其他数据?
这就是它最终为我工作的方式:
let newArray= search
.filter(({ id }) => {
return !tags.some(tag => {
return tag.id == id
})
})
.map(tag => {
return (
<Button
key={tag.id}
>
{tag.name}
</Button>
)
})
使用map
获取tags array.
中object
中的所有值 在search array
上运行filter
,如果上面创建的array
中不存在该id
,则返回它
var tags = [{id:1, name:'x'},{id:2, name:'y'},{id:5, name:'z'}]
var search = [{id:2, name:'y'},{id:5, name:'z'},{id:15, name:'s'}]
console.log(search.filter(({id,name})=>!tags.find(e=>e.id==id && e.name==name)))
我假设示例中所需的结果是{id:15}
,因为 15 是搜索中唯一不存在于标签中的值。
在这种情况下,您应该过滤搜索数组,而不是标签。条件是在标签中找不到搜索的内容。find
方法在这里可以派上用场。
实际代码可能如下所示
let filtered = search.filter(searched =>
!tags.find(tagged => tagged.id === searched.id)
)
希望有帮助 - 卡洛斯
您可以使用过滤器和查找或一些在一行中执行此操作:
const tags = [{id:1},{id:2},{id:5}];
const search = [{id:2},{id:5},{id:15}];
const result1 = search.filter(({ id }) => !tags.some(tag => tag.id === id));
const result2 = search.filter(({ id }) => !tags.find(tag => tag.id === id));
console.log(result1, result2);
如果您使用旧版本的 JavaScript,下面是一个没有箭头函数和解构的版本:
const tags = [{id:1},{id:2},{id:5}];
const search = [{id:2},{id:5},{id:15}];
const result1 = search.filter(search => { return !tags.some(tag => { return tag.id === search.id; }); });
const result2 = search.filter(search => { return !tags.find(tag => { return tag.id === search.id; }); });
console.log(result1, result2);
我认为你想要的是:
search.filter(searchTag => tags.every(tag => tag.id != searchTag.id))
这就是它对我的工作方式:
let newArray= search
.filter(({ id }) => {
return !tags.some(tag => {
return tag.id == id
})
})
.map(tag => {
return (
<Button
key={tag.id}
>
{tag.name}
</Button>
)
})