【发布时间】:2021-12-16 11:02:48
【问题描述】:
我正在尝试创建一个搜索/过滤功能,允许用户过滤一个 JS 对象数组,该数组返回一个填充了与搜索查询匹配的数据的数组。
我希望能够在一个查询中搜索多个属性,例如;如果我搜索 HKG,它将返回所有 3 个对象,但如果我搜索 HKG 12345,它将返回数组中的第一个对象。
另一个例子是,如果我要搜索 8,它会从匹配查询的 sumOfContainers 属性返回数组中的前 2 个对象,但如果我搜索 8 SAV,它只会返回第一个对象。
results = [];
objects = [
{laneId:"12345", lane:"HKG-SAV", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"},
{laneId:"12346", lane:"HKG-FRA", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"},
{laneId:"12347", lane:"HKG-LAX", equipmentType:"20'STD", sumOfContainers: "9", baseline:"$1234", new:"$1234", newSaving:"$1234"},
];
const Search = (toSearch) => {
for(var i=0; i<objects.length; i++) {
for(key in objects[i]) {
if(objects[i][key].indexOf(toSearch)!=-1) {
results.push(objects[i]);
}
}
}
}
我尝试的问题是它会返回重复的数据。我在网上看到了很多帖子,但我发现很难找到寻求类似结果的帖子。
我正在尝试使用原生 JavaScript 来实现这一点。
【问题讨论】:
-
只需在
push之后添加一个break。别忘了return results。 -
Array.from(new Set(results))会使结果独一无二。objects.filter可能会有所帮助,但这些条件(例如能够搜索“HKG 12345”)有点复杂。 -
@trincot 问题是我仍然想过滤多个属性。这不会创建我正在寻找的确切功能。我还想分解查询,以便它可以按多个属性进行过滤。
-
@Corona,确实如此。想一想:一旦您有一个匹配的键,您就不想检查该 same 对象的其他键。它只是你退出的内部循环。
-
@SebastianSimon 是的,我意识到使数据不重复很容易,但是在单个查询中搜索多个属性会使事情变得非常困难。我想知道我是否应该用空格分隔字符串并重新运行搜索功能,然后过滤掉所有重复项。不确定这是否是更优化的代码。
标签: javascript arrays json search filter