如何从对象数组搜索字符串字符?



下面是一个对象数组。这是原始数据

const data = [
{id:1, sItem:"This is javascript", status:"trending"},
{id:2, sItem:"javascript is fun", status:"trending"},
{id:3, sItem:"learning javascript", status:"trending"},
{id:4, sItem:"how to code in javascript", status:"trending"},
{id:5, sItem:"javascript will rule", status:"trending"},
{id:6, sItem:"javascript can do anything", status:"trending"}
]

我想搜索sItemjavascript并重新排序,以便无论javascript出现在sItem开头的地方该元素应该首先出现,索引为0。其他以javascript开头的对象应该紧随其后,然后是其他数组对象。

预期o/p

const data = [
{id:2, sItem:"javascript is fun", status:"trending"},
{id:5, sItem:"javascript will rule", status:"trending"},
{id:6, sItem:"javascript can do anything", status:"trending"},
{id:1, sItem:"This is javascript", status:"trending"},
{id:3, sItem:"learning javascript", status:"trending"}, 
{id:4, sItem:"how to code in javascript", status:"trending"}
]

我尝试过滤数组对象const search = "javascript" data.filter(obj => Object.values(obj).some(val => val.includes(search)))

任何建议都会有用的。

这将把'javascript'从其他的中分离出来,然后按字母顺序分别对它们进行排序。最后,它将所有这些组合成一个新的数组。

[...data.reduce((b,a) => {
if (a.sItem.split(" ")[0].toLowerCase() == "javascript") b[0].push(a);
else b[1].push(a);
return b
}, [[],[]]).map(m => m.sort((a,b) => a.sItem.localeCompare(b.sItem)))]

[...data将接收输出并将其排列为单个数组。reduce(b,a将从其余的javascript中分离出来。.sort(a,b将按字母顺序排列这两个数组中的每一个(javascript作为第一个字符串的数组和其余的数组)。

const data = [{id:1, sItem:"This is javascript", status:"trending"},{id:2, sItem:"javascript is fun", status:"trending"},{id:3, sItem:"learning javascript", status:"trending"},{id:4, sItem:"how to code in javascript", status:"trending"},{id:5, sItem:"javascript will rule", status:"trending"},{id:6, sItem:"javascript can do anything", status:"trending"}]
let neworder = [...data.reduce((b,a) => {
if (a.sItem.split(" ")[0].toLowerCase() == "javascript") b[0].push(a);
else b[1].push(a);
return b
}, [[],[]]).map(m => m.sort((a,b) => a.sItem.localeCompare(b.sItem)))]
console.log(neworder)

您可以尝试这样做,循环遍历条目,验证字符串是否与术语匹配,并保存到两个数组中,一个包含以匹配项开始的字符串,另一个只包含匹配项,最后将它们连接起来以创建排序的arr。

const filterByKeyword = (arr, keyword) => {
const [a, b] = [[], []];
for (let i = 0; i < arr.length; i++) {
const el = arr[i];
if (el.sItem.includes(keyword)) {
if (el.sItem.startsWith(keyword)) a.push(arr[i]);
else b.push(arr[i]);
}
}
return [...a, ...b];
};
console.log(filterByKeyword(data, search));

如果这个问题不是特别针对JavaScript逻辑,那么你可以使用这个轻量级但快速的npm包,如ss-search执行您的搜索

var ssSearch = require("ss-search")
const data =  [{id:2, sItem:"javascript is fun", status:"trending"},{id:5, sItem:"javascript will rule", status:"trending"},{id:6, sItem:"javascript can do anything", status:"trending"},{id:1, sItem:"This is javascript", status:"trending"},{id:3, sItem:"learning javascript", status:"trending"},{id:4, sItem:"how to code in javascript", status:"trending"}]
const searchKeys = ["sItem"] 
const searchText = "javascript"
const results = ssSearch.search(data, searchKeys, searchText)
console.log(results)

你可以在npm.runkit

中试试上面的代码

最新更新