Я хочу использовать 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?
Вы можете сделать result = Object.values(ob).some(str => _.includes(str, search));
@ChrisG точно моя мысль
@Kobe: Вы сказали, что Lodash - это излишество. Но вам нравится ответ с использованием Lodash? ?
@Mowzer здесь даже не нужно использовать _.includes
. Вы можете буквально использовать str.indexOf(search) !== -1
. Моя мысль заключалась в том, чтобы использовать и Object.values
, и some()
Вы можете найти частичную строку в массиве значения объекта вот так.
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()
Это не то, как работает 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» считались идентичными?
Найден stackoverflow.com/a/37435964/2391795, который помог мне реализовать нечувствительное сопоставление регистра.
Спасибо за редактирование. Я добавил последнее решение, которое обрабатывает буквы с диакритическими знаками и нечувствительными проверками.
Интересно, что вы использовали deburr, я реализовал другое решение, используя stackoverflow.com/questions/990904/…, которое дает return includes( mostInterestingValue.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ''), searchedValue.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ''), );
и отлично работает. Не уверен, в чем разница, но кажется, что вам намного проще рассуждать.
Lodash является излишним для простой проблемы.