【问题标题】:filter JSON array javascript过滤 JSON 数组 javascript
【发布时间】:2018-09-18 18:54:50
【问题描述】:

我只是在考虑如何简化下面的过滤器代码。它从包含三个特定 JSON 字符串键之一中的搜索值的 JSON 数组中过滤掉所有 JSON 字符串。我的 Visual Studio 正在对我微笑,如果我在拿我的代码复杂性开玩笑:D 所以我只是好奇是否有任何不同的方式来修改我的代码 sn-p 以使其更有效。

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"
}]

【问题讨论】:

标签: javascript node.js angular


【解决方案1】:

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

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

在我看来似乎更干净。

【讨论】:

    【解决方案2】:

    如果找到,您可以获取对象的键并使用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()))
            })
        });
    });
    

    【讨论】:

    • Grazie Nina,看起来很棒!
    • 类型检查呢? (我的意思是names1
    • 这看起来一点也不“简化”。
    • 如果不知道数据要循环什么,除了检查相同的 Jard 编码属性之外,很难简化一些东西......
    猜你喜欢
    • 2011-09-14
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多