使用 Lodash 查找对象的任何属性值中的部分字符串

Mow*_*zer 2 javascript javascript-objects lodash

我想使用 Lodashtrue在对象的任何值中包含部分字符串的匹配项时返回。我已经尝试过_.includes如下。

const ob = {first: "Fred", last: "Flintstone",}
const search = "stone";
const result = _.includes(ob, search)
console.log(result); // false
Run Code Online (Sandbox Code Playgroud)

我还尝试过使用正则表达式而不是字符串作为搜索词。

const search = /stone/gi;
Run Code Online (Sandbox Code Playgroud)

两次都result返回false。我想result回来true。我怎样才能在 Lodash 中做到这一点?

Ori*_*ori 8

您可以使用 lodash 的_.some()(适用于对象)和 lodash/vanilla include 来查找当前属性的值是否具有搜索字符串:

\n\n

\r\n
\r\n
const includesValue = (val, obj) => _.some(obj, v => _.includes(v, val))\r\n\r\nconst obj = {first: "Fred", last: "Flintstone",}\r\nconst search = "stone";\r\nconst result = includesValue(search, obj)\r\n\r\nconsole.log(result); // true
Run Code Online (Sandbox Code Playgroud)\r\n
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

还有 lodash/fp 版本:

\n\n

\r\n
\r\n
const includesValue = val => _.some(_.includes(val))\r\n\r\nconst obj = {first: "Fred", last: "Flintstone",}\r\nconst search = "stone";\r\nconst result = includesValue(search)(obj)\r\n\r\nconsole.log(result); // true
Run Code Online (Sandbox Code Playgroud)\r\n
<script src=\'https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)\'></script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

要处理区分大小写和带有变音符号的字母,您可以使用_.deburr()(或这个答案 ),并将文本转换为小写:

\n\n

\r\n
\r\n
const normalize = str => _.toLower(_.deburr(str))\r\n\r\nconst includesValue = (val, obj) => {\r\n  const search = normalize(val)\r\n  return _.some(obj, v => normalize(v).includes(search))\r\n}\r\n\r\nconst obj = {first: "Fred", last: "Flintston\xc3\xa9",}\r\nconst search = "Stone";\r\nconst result = includesValue(search, obj)\r\n\r\nconsole.log(result); // true
Run Code Online (Sandbox Code Playgroud)\r\n
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n