Использование Lodash для поиска частичной строки в любом значении свойства объекта

Я хочу использовать Lodash для возврата true, когда объект содержит в любом из своих значений совпадение с частичной строкой. Я пробовал это с _.includes следующим образом.

const ob = {first: "Fred", last: "Flintstone",}
const search = "stone";
const result = _.includes(ob, search)
console.info(result); // false

Я также пробовал это, используя регулярное выражение вместо строки для условия поиска.

const search = /stone/gi;

Оба раза result возвращается false. Я хочу result вернуться true. Как я могу сделать это в Lodash?

Lodash является излишним для простой проблемы.

Kobe 29.05.2019 16:48

Вы можете сделать result = Object.values(ob).some(str => _.includes(str, search));

Chris G 29.05.2019 16:50

@ChrisG точно моя мысль

Kobe 29.05.2019 16:50

@Kobe: Вы сказали, что Lodash - это излишество. Но вам нравится ответ с использованием Lodash? ?

Let Me Tink About It 29.05.2019 16:52

@Mowzer здесь даже не нужно использовать _.includes. Вы можете буквально использовать str.indexOf(search) !== -1. Моя мысль заключалась в том, чтобы использовать и Object.values, и some()

Kobe 29.05.2019 16:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
7 363
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете найти частичную строку в массиве значения объекта вот так.

const ob = {
  first: "Fred",
  last: "Flintstone"
}
const search = "stone"
const isFound = Boolean(Object.values(ob).find(item => item.includes(search)))
console.info(isFound)

И, согласно предложению @Kobe, вы можете использовать немного вместо оценки результата find с Boolean().

const ob = {
  first: "Fred",
  last: "Flintstone"
}
const search = "stone"
const isFound = Object.values(ob).some(item => item.includes(search))
console.info(isFound)

Вы можете просто использовать some() вместо find(), не используя Boolean()

Kobe 29.05.2019 16:59

Это не то, как работает lodash.

Вы должны искать значения объекта, а не сам объект. И вы должны проверить каждое значение по очереди.

Также вам не нужен lodash для этого.

const ob = {first: "Fred", last: "Flintstone",}
const search = "stone";
const result = Object.values(ob).some(value => value.indexOf(search) !== -1);
console.info(result); // true

Вы можете использовать _filter, если хотите использовать lodash.

const ob = {first: "Fred", last: "Flintstone",}
var filteredOb = _.filter(ob, function(elem) {
    return elem.indexOf("stone") > -1;
});
console.info(filteredOb);

Вы можете использовать lodash _.some() (который работает с объектами) и lodash/vanilla, чтобы узнать, имеет ли текущее значение свойства строку поиска:

const includesValue = (val, obj) => _.some(obj, v => _.includes(v, val))

const obj = {first: "Fred", last: "Flintstone",}
const search = "stone";
const result = includesValue(search, obj)

console.info(result); // true
<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

И версия lodash/fp:

const includesValue = val => _.some(_.includes(val))

const obj = {first: "Fred", last: "Flintstone",}
const search = "stone";
const result = includesValue(search)(obj)

console.info(result); // true
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

Чтобы справиться с чувствительностью к регистру и буквами с диакритическими знаками, вы можете использовать _.deburr() (или this отвечать) и преобразовать текст в нижний регистр:

const normalize = str => _.toLower(_.deburr(str))

const includesValue = (val, obj) => {
  const search = normalize(val)
  return _.some(obj, v => normalize(v).includes(search))
}

const obj = {first: "Fred", last: "Flintstoné",}
const search = "Stone";
const result = includesValue(search, obj)

console.info(result); // true
<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

Как бы вы порекомендовали сделать его нечувствительным к регистру? И сопоставить акценты, чтобы «ee» считались идентичными?

Vadorequest 28.11.2019 18:58

Найден stackoverflow.com/a/37435964/2391795, который помог мне реализовать нечувствительное сопоставление регистра.

Vadorequest 28.11.2019 19:15

Спасибо за редактирование. Я добавил последнее решение, которое обрабатывает буквы с диакритическими знаками и нечувствительными проверками.

Ori Drori 28.11.2019 19:45

Интересно, что вы использовали deburr, я реализовал другое решение, используя stackoverflow.com/questions/990904/…, которое дает return includes( mostInterestingValue.toLowerCase().normalize('NFD').replace(‌​/[\u0300-\u036f]/g, ''), searchedValue.toLowerCase().normalize('NFD').replace(/[\u030‌​0-\u036f]/g, ''), ); и отлично работает. Не уверен, в чем разница, но кажется, что вам намного проще рассуждать.

Vadorequest 29.11.2019 12:26

Другие вопросы по теме