javascript - 在数组对象中、在选定的键中过滤搜索

标签 javascript arrays filter lodash

我需要一些建议或最好的方法来使用传递的值将其数组数据过滤器。 目前,我有

let arrayobject = [
{"name": "apple", "type": "juice-material", "srnum": 123234},
{"name": "cranberry", "type": "desert-material", "srnum": 98989},
{"name": "grapes", "type": "wine-material", "srnum":656565}]

如果我通过了apple,那么返回数组将是

[{"name": "apple", "type": "juice-material", "srnum": 123234}]

如果我通过了wine-material 返回结果

{"name": "grapes", "type": "wine-material", "srnum":656565}

与 srnum 类似,传递它时会给出过滤器数组对象结果。

目前,

我尝试过使用

_.some(arrayobject, _.unary(_.partialRight(_.includes, passedValue)))

它给出了上下文结果,但不可预测。

让我知道过滤数据的最佳方法。 谢谢。

最佳答案

嗯,我认为你的方法几乎是最好的。但是,您使用 _.some如果任何项目匹配,如果您将其与 _.filter 交换,则只会给出 bool 结果您可以获得所有匹配的项目,也可以更改为 _.find只获取第一个:

let arrayobject = [
  {"name": "apple",     "type": "juice-material",  "srnum": 123234},
  {"name": "cranberry", "type": "desert-material", "srnum": 98989},
  {"name": "grapes",    "type": "wine-material",   "srnum": 656565}
]

function filterByValues(collection, whatToSearchFor) {
  //separating just for easier readability
  let predicate = _.unary(_.partialRight(_.includes, whatToSearchFor));
  
  return _.filter(collection, predicate);
}

//matches a value
console.log(filterByValues(arrayobject, "apple"));
console.log(filterByValues(arrayobject, "wine-material"));
console.log(filterByValues(arrayobject, 98989));

//doesn't match a key
console.log(filterByValues(arrayobject, "name"));
console.log(filterByValues(arrayobject, "type"));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

话虽如此,@georg 在评论中指出,您可以使用更少的 Lodash 功能来重写此代码,而只需使用 _.includes 进行简单的回调即可。 - 这可能比使用_.partialRight_.unary更具可读性:

let arrayobject = [
  {"name": "apple",     "type": "juice-material",  "srnum": 123234},
  {"name": "cranberry", "type": "desert-material", "srnum": 98989},
  {"name": "grapes",    "type": "wine-material",   "srnum": 656565}
]

function filterByValues(collection, whatToSearchFor) {
  //separating just for easier readability
  let predicate = item => _.includes(item, whatToSearchFor);
  
  return _.filter(collection, predicate);
}

//matches a value
console.log(filterByValues(arrayobject, "apple"));
console.log(filterByValues(arrayobject, "wine-material"));
console.log(filterByValues(arrayobject, 98989));

//doesn't match a key
console.log(filterByValues(arrayobject, "name"));
console.log(filterByValues(arrayobject, "type"));
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

关于javascript - 在数组对象中、在选定的键中过滤搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57803665/

相关文章:

javascript - Openfire:在 openfire 服务器中使用 SASL Anonymous 创建用户

c++ - 实现nd数组时如何处理C++中的 "out of range"异常

c - 将数组从 C 传递到 nasm 时出现段错误

javascript - 如何在一个循环中组合/合并/相交两个对象数组?

javascript - 如何在 Cocoa 应用程序中加载/暂停/恢复 YouTube 视频?

javascript - meteor 按日期和时间发送电子邮件

javascript - Framework7如何更改浏览器地址栏中的URL

c# - 将值与数组中的前一个值相加

jquery - 选择框作为类别过滤器在 Chrome、IE 上不起作用。

arrays - 快速使用过滤器来获取两个数组之间的差异