我怎么能在javascript中得到不匹配的字符串?

如何解决我怎么能在javascript中得到不匹配的字符串?

我有一个预订数组,我必须使用 searchValue 在数组内部进行搜索

在这里,我们必须检查预订 ID 字段。如果预订 id 和 searchValue 匹配,我们必须将该对象推送到结果数组中。

工作代码

  1. 下面的结果数组示例

    让 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"

demo

解决方法

OP 就快到了。当然,对于每个 数组项的 bookingid 必须delete 来自之前生成的 set 的这个数值。然后只需要创建一个 Array from 变异的 setjoin 其项目/值,以获得最终的字符串值结果。

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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?