过滤JSON数组JavaScript

时间:2018-09-18 18:54:50

标签: javascript node.js angular

我只是在考虑如何简化下面的过滤器代码。它从JSON数组中筛选出所有JSON字符串,其中包含三个特定JSON字符串键之一中的搜索值。我的Visual Studio在对我微笑,如果我在开玩笑我的代码复杂性:D,那么我很好奇是否有其他方法可以修改我的代码片段以使其更有效。

return _.filter(obj, item => {
    return _.every(filterParams, keyword => {
        return _.some(item, value => {
            return _.isString(value) && (
              item.names1.toLowerCase().includes(keyword.toLowerCase()) ||
              item.names2.toLowerCase().includes(keyword.toLowerCase()) ||
              item.names3.toLowerCase().includes(keyword.toLowerCase()))
        })
    });
  });

这是一个数据示例:

export const data = [{
  "HELP": "ageGroup1",
  "Name": "ga1",
  "EN": "ageGroup1",
  "CZ": "N",
  "names1": "AgeGroup",
  "names2": "Element",
  "names3": "N"
}, {
  "HELP": "Level2",
  "Name": "L2",
  "EN": "aggregationGroup",
  "CZ": "N",
  "names1": "AggregationLevel",
  "names2": "ElementLevel",
  "names3": "N"
}]

2 个答案:

答案 0 :(得分:0)

我试图重构您的代码。我认为您不需要使用lodash。这可能不是代码的确切重构,但希望它能使您对代码的外观有所了解。

let keywordCompare = (keyword) => keyword.toLowerCase().includes(keyword.toLowerCase());
let filteredNames = obj.filter(
obj => keywordCompare(obj.name1) || keywordCompare(obj.name2) || keywordCompare(obj.name3)
);

在我看来,这看起来要干净得多。

答案 1 :(得分:-1)

如果发现该对象,您可以拿起对象的键并用some进行迭代以短路。

return _.filter(obj, item => {
    return _.every(filterParams, keyword => {
        return _.some(item, value => {
            return _.isString(value) && ['names1', 'names2', 'names3']
                .some(n => item[n].toLowerCase().includes(keyword.toLowerCase()))
        })
    });
});