Javascript — Поиск Определенных Объектов И Поиск Объектов С Наиболее Правильными Совпадениями

#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. Изменил его на другой подход