#javascript #arrays #database #object #search
Вопрос:
В чем дело, у меня есть общий вопрос js, с которым я боролся. Не совсем уверен, как это сделать, но у меня есть массив объектов, подобных этому
{
"postHeight": "5",
"type": "CL",
"barb": "None"
(Actual object will have around 20-30 properties to search through)
}
У меня также есть функция поиска, которая позволяет вам просматривать эти объекты, чтобы найти нужный. В массиве будут сотни таких объектов, поэтому , если я хочу найти один конкретный объект с высотой 6
, типом CL
и колючкой straight
, он найдет объект, в котором все они совпадают, а затем переместит весь соответствующий объект в другой массив. Достаточно просто. Моя главная проблема заключается в том, что я хочу иметь возможность сообщить пользователю, если только объекты » postHeight
и type
соответствуют их входным данным, не barb
совпадая с их входными данными, что No exact matches found, but there is a match that has the correct postHeight and type, just with an incorrect barb.
Хотя я не совсем уверен, как мне следует это делать. Может быть 15 объектов с совпадением postHeights
и 20 с совпадающими type
s, но я хочу найти объект с наибольшим количеством совпадений, а затем точно указать пользователям, какие свойства совпадают, а какие не соответствуют их поисковому запросу.
Объект, используемый в этом вопросе, имеет только 3 свойства, но у нас, скорее всего, будет больше в диапазоне 20-30 для каждого объекта
Комментарии:
1. Вы можете вернуть массив объектов вместе с количеством полей, соответствующих критериям. Затем вы можете отсортировать массив по этому количеству.
Ответ №1:
Вы можете отсортировать массив объектов по количеству совпадающих полей:
const data = [
{
"postHeight": "6",
"type": "CL",
"barb": "straight"
},
{
"postHeight": "5",
"type": "CL",
"barb": "straight"
},
{
"postHeight": "6",
"type": "SA",
"barb": "straight"
},
{
"postHeight": "6",
"type": "CL",
"barb": "None"
}
]
const search = (obj) => {
const entries = Object.entries(obj);
const searchKeys = Object.keys(obj);
return data.map((el) => {
const matched = entries.filter(([k, v]) => el[k] === v);
return { count: matched.length, ...el, unmatched: searchKeys.filter(k => el[k] !== obj[k]) }
}).sort((a, b) => b.count - a.count);
}
console.log(search({postHeight: "6", type: "CL", barb: "straight"}));
Комментарии:
1. Это не кажется жизнеспособным, если бы мы решили добавить больше свойств. С помощью этого метода пересечения он будет работать с текущим числом, но с течением времени мы, скорее всего, будем добавлять гораздо больше свойств к каждому объекту. Возможно, мне следует отредактировать это в моем первоначальном посте
2. Изменил его на другой подход