如何解决我怎么能在javascript中得到不匹配的字符串?
我有一个预订数组,我必须使用 searchValue
在数组内部进行搜索。
在这里,我们必须检查预订 ID 字段。如果预订 id 和 searchValue
匹配,我们必须将该对象推送到结果数组中。
工作代码
-
下面的结果数组示例
让 searchValue = "12,13,15"
结果:
[{ name:"user 3",bookingid:12,product: "ui" },{ name:"user 4",bookingid:13,product: "ef" }]
预期输出:
12,13 在预订数组中匹配,所以我们必须得到 NotMatchedsearchValue = "15" 你能在这里帮忙吗
let bookingArr = [
{ name:"user 1",bookingid:10,product: "ab" },{ name:"user 1",product: "cd" },{ name:"user 2",bookingid:11,product: "ef" },{ name:"user 3",];
let searchValue = "12,15";
let set = new Set(searchValue.split(",").map(Number)); // for faster lookup
let res = bookingArr.filter(x => set.has(x.bookingid));
console.log(res);
// how can i get not matched searchValue
// expected result notmatchedsearchValue ="15"
解决方法
OP 就快到了。当然,对于每个 数组项的 bookingid
必须delete
来自之前生成的 set
的这个数值。然后只需要创建一个 Array from 变异的 set
和 join
其项目/值,以获得最终的字符串值结果。
OP 的代码有一些细微的变化......
let bookingArr = [
{ name:"user 1",bookingid:10,product: "ab" },{ name:"user 1",product: "cd" },{ name:"user 2",bookingid:11,product: "ui" },product: "ef" },{ name:"user 3",bookingid:12,{ name:"user 4",bookingid:13,];
let searchValue = '12,13,15';
let set = new Set(searchValue.split(',').map(Number)); // for faster lookup
bookingArr.forEach(item => set.delete(item.bookingid));
let notmatchedSearchValue = Array.from(set).join(',');
console.log({ searchValue,notmatchedSearchValue });
// expected result notmatchedsearchValue = '15'
.as-console-wrapper { min-height: 100%!important; top: 0; }
一个更通用的方法是实现一个 reducer 函数,它具有一个过滤过程,它与数组项属性名称无关。这个reducer 也同时完成了这两个任务,通过自定义属性名(key
)过滤数组项并提供缺失(不匹配)值的最终字符串值......类似...... /p>
function collectMatchingItemAndMissingValue(collector,item) {
const { key,searchValues,missingValues,matchingItems } = collector;
const value = item[key];
if (searchValues.has(value)) {
matchingItems.push(item);
missingValues.delete(value);
}
return collector;
}
function getMatchingItemsAndMissingValues(arr,key,castValue) {
searchValues = new Set(
searchValues.split(',').map(castValue)
);
const {
missingValues,matchingItems,} = arr.reduce(collectMatchingItemAndMissingValue,{
key,missingValues: new Set([...searchValues]),matchingItems: [],});
return {
matchingItems,missingValues: [...missingValues].join(','),};
}
const bookingArr = [
{ name:"user 1",];
const searchValues = '12,15';
const castValue = str => Number(str.trim());
const {
matchingItems,} = getMatchingItemsAndMissingValues(bookingArr,'bookingid',castValue);
console.log({ matchingItems,searchValues });
console.log({
...getMatchingItemsAndMissingValues(
bookingArr,'product','xy,ui,mn,qr,ef',str => str.trim(),),searchValues: 'xy,ef'
});
.as-console-wrapper { min-height: 100%!important; top: 0; }
你可以尝试这样的事情:
for (let result of res) {
set.delete(result.bookingid);
}
那么,set
将只包含未返回的值——在本例中,只包含 15
。
如果您想保留 set
中的值,您还可以使用类似 let nset = new Set(set);
的内容克隆该集合,然后使用 nset
代替 set
for 循环。
如果你想要一个单线,灵感来自@Barmar:
[...set].filter(x => !res.some(y => y.bookingid == x)).join(",");
,
与您之前的question相比,这里的情况有所不同。所以,在这里你需要把 Set
变成 bookingArr
而不是 searchVal
。
let bookingArr = [
{ name: "user 1",bookingid: 10,{ name: "user 1",{ name: "user 2",bookingid: 11,{ name: "user 3",bookingid: 12,{ name: "user 4",bookingid: 13,];
let searchValue = "12,15";
let set = new Set(bookingArr.map((b) => b.bookingid));
let res = searchValue
.split(",")
.map(Number)
.filter((s) => !set.has(s))
.join();
console.log(res);
如果您可以将新集合的浅表复制为数组,我们可以使用数组 some()
方法并使用 !
否定它以从该集合中查找任何 ID bookingArr
中不存在。
let bookingArr = [
{ name:"user 1",];
let searchValue = "12,15";
let set = new Set(searchValue.split(",").map(Number)); // for faster lookup
let res = bookingArr.filter(x => set.has(x.bookingid));
// console.log(res);
let notMatchedSearchValues = [...set].filter(y => !bookingArr.some(x => y === x.bookingid));
notMatchedSearchValues.forEach(id => console.log(`notMatchedSearchValue: ${id}`));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。