来自 JSON 结构的搜索功能
Search function from JSON structure
我正在寻找根据用户在搜索字段中输入的内容搜索 JSON 值的解决方案。
例如:如果用户键入 ASD,则应显示 Json 值中包含 ASD 的任何数据。
我找到了一个像我想要的那样工作的例子。但是,他们没有使用 JSON 结构。
这是我遵循的代码:
App.svelte:
<script>
import Search from "./Search.svelte";
const data = [
"Metrics Server",
"Node.js",
"Virtual Machine",
"Virtual Private Server",
];
</script>
<Search autofocus {data} let:filtered>
<ul>
{#each filtered as item}
<li>{item}</li>
{/each}
</ul>
</Search>
Search.svelte
<script>
import {onMount} from "svelte";
export let autofocus = false;
export let data = [];
let input = undefined;
let value ="";
onMount(() =>{
if(autofocus) {
input.focus();
}
});
$: filtered = data.filter((item) =>
item.toLowerCase().includes(value.toLowerCase()));
</script>
<style>
ul{
list-style:none;
}
</style>
<input bind:this="{input}" type="search" bind:value />
<ul>
{#each filtered as item}
<li>{item}</li>
{/each}
</ul>
此代码不适用于 JSON 结构,例如:
{"name": "tommy, "class":"a"},
{"name": "dummy, "class":"b"} ...
它会 return 一个错误,例如:
item.toLowerCase is not a function
我如何实现一个搜索功能,如果用户搜索“tommy”return 我的名字
这就是我检索 Json 数据的方式:
let info ="";
onMount(async () =>{
const resp = await fetch('https:xx.xxx.xxx')
info = await resp.json();
});
我取回的数据格式如下:[已编辑]
[ {
"table_schema": "x",
"table_name": "a",
"column_name": "typname",
"data_type": "name",
"character_maximum_length": null
},
{
"table_schema": "b",
"table_name": "x",
"column_name": "typnamespace",
"data_type": "oid",
"character_maximum_length": null
}]
我已经编辑了我的真实 JSON 文件。该代码确实适用于我的虚拟 JSON 但不适用于真实的。有什么想法吗?
您必须遍历项目的每个属性并比较每个属性:
- 首先循环
data.filter
的项目
- 获得每个道具的所有道具
Object.keys(item)
- 检查是否至少有一个符合条件
.some
- 将项目中的键与值进行比较
item[key].toLower....
$: filtered = data.filter(item =>
Object.keys(item).some(key =>
item[key].toLowerCase().includes(value.toLowerCase())
)
);
请注意,此代码假定数组中的 所有 项都是对象,如果您混合使用对象和字符串,它将失败:
[ "Tommy", { name: "Sammy" }]
这里第一个元素实际上没有'keys'。您必须先为此添加额外的检查。
我正在寻找根据用户在搜索字段中输入的内容搜索 JSON 值的解决方案。
例如:如果用户键入 ASD,则应显示 Json 值中包含 ASD 的任何数据。
我找到了一个像我想要的那样工作的例子。但是,他们没有使用 JSON 结构。
这是我遵循的代码: App.svelte:
<script>
import Search from "./Search.svelte";
const data = [
"Metrics Server",
"Node.js",
"Virtual Machine",
"Virtual Private Server",
];
</script>
<Search autofocus {data} let:filtered>
<ul>
{#each filtered as item}
<li>{item}</li>
{/each}
</ul>
</Search>
Search.svelte
<script>
import {onMount} from "svelte";
export let autofocus = false;
export let data = [];
let input = undefined;
let value ="";
onMount(() =>{
if(autofocus) {
input.focus();
}
});
$: filtered = data.filter((item) =>
item.toLowerCase().includes(value.toLowerCase()));
</script>
<style>
ul{
list-style:none;
}
</style>
<input bind:this="{input}" type="search" bind:value />
<ul>
{#each filtered as item}
<li>{item}</li>
{/each}
</ul>
此代码不适用于 JSON 结构,例如: {"name": "tommy, "class":"a"}, {"name": "dummy, "class":"b"} ...
它会 return 一个错误,例如:
item.toLowerCase is not a function
我如何实现一个搜索功能,如果用户搜索“tommy”return 我的名字
这就是我检索 Json 数据的方式:
let info ="";
onMount(async () =>{
const resp = await fetch('https:xx.xxx.xxx')
info = await resp.json();
});
我取回的数据格式如下:[已编辑]
[ {
"table_schema": "x",
"table_name": "a",
"column_name": "typname",
"data_type": "name",
"character_maximum_length": null
},
{
"table_schema": "b",
"table_name": "x",
"column_name": "typnamespace",
"data_type": "oid",
"character_maximum_length": null
}]
我已经编辑了我的真实 JSON 文件。该代码确实适用于我的虚拟 JSON 但不适用于真实的。有什么想法吗?
您必须遍历项目的每个属性并比较每个属性:
- 首先循环
data.filter
的项目
- 获得每个道具的所有道具
Object.keys(item)
- 检查是否至少有一个符合条件
.some
- 将项目中的键与值进行比较
item[key].toLower....
$: filtered = data.filter(item =>
Object.keys(item).some(key =>
item[key].toLowerCase().includes(value.toLowerCase())
)
);
请注意,此代码假定数组中的 所有 项都是对象,如果您混合使用对象和字符串,它将失败:
[ "Tommy", { name: "Sammy" }]
这里第一个元素实际上没有'keys'。您必须先为此添加额外的检查。