【问题标题】:Filter an object to get values also in another array [duplicate]过滤一个对象以获取另一个数组中的值[重复]
【发布时间】:2017-02-01 21:55:55
【问题描述】:

我有一个对象和一个数组

 {
    "library_items": 
    [

    {
        "id": "23493",
        "artifactID": "",
        "title":"Physics Lecture",
        "authors": [{
                    "name": "Don Johnson",
                    "artifactID": "",
                    "role": "author",
                    "roleID": ""
                    }],
        "artifactType": "games",
        "domain":   {
                    "branch": "",
                    "description": "",
                    "branchInfo": {
                                    "branch": "",
                                    "subject": "Physics"
                                }
                    },
        "type": {
                "description": "",
                "id": "",
                "name": ""
        }
    },


   {
        "id": "23493",
        "artifactID": "",
        "title":"Chemistry Lecture",
        "authors": [{
                    "name": "Don Johnson",
                    "artifactID": "",
                    "role": "author",
                    "roleID": ""
                    }],
        "artifactType": "games",
        "domain":   {
                    "branch": "",
                    "description": "",
                    "branchInfo": {
                                    "branch": "",
                                    "subject": "Chemistry"
                                }
                    },
        "type": {
                "description": "",
                "id": "",
                "name": ""
        }
    }
    ]
  }

我还有一个数组

  var subjects = ['Physics', 'Biology', 'Mathematics']

如何使用“主题”中的数组值过滤对象?我的意思是我想从对象中获取主题对应于任何数组值的项目。

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    基本上,使用filterindexOf 方法。

    1. filter 使用此方法根据回调函数中定义的匹配条件过滤数组。
    2. indexOf 检查数组是否包含值。
      注意: 还有另一种方法includes 可以检查数组中是否存在元素,这是 ES7 草案的一部分,但许多浏览器不支持它。

    var items = {
     "library_items": 
        [
        {
            "id": "23453",
            "artifactID": "",
            "title":"Physics Basics",
            "subject": "Physics"
    
        },
        {
            "id": "23453",
            "artifactID": "",
            "title":"Chemistry Basics",
            "subject": "Chemistry"
    
        }
    
        ]
    };
    var subjects = ['Physics', 'Biology', 'Mathematics'];
    var filtered = items.library_items.filter((x) => subjects.indexOf(x.subject) > -1);
    console.log(filtered);

    【讨论】:

    • 我编辑了代码并创建了一个嵌套对象...cn 我仍然使用上面的方法来获取域中“主题”的值> branchInfo?或者我该如何调整它
    • 是的,只需将x.subject 替换为x.domain.branchInfo.subject
    • 是的,我知道..但我正在考虑这样一种情况,即主题可能位于对象树中的任何位置。我不知道我应该期待的对象的结构,但我确实知道有一个“主题”
    • 有没有办法扫描整个对象以找到“主题”?
    • 在这种情况下,您需要map 数组,以便您至少可以转换可以查询对象的数组。
    【解决方案2】:

    您可以使用Array#filterArray#includes

    var items = { library_items: [{ id: "23453", artifactID: "", title: "Physics Basics", subject: "Physics" }, { id: "23453", artifactID: "", title:"Chemistry Basics", subject: "Chemistry" }] },
        subjects = ['Physics', 'Biology', 'Mathematics'],
        filtered = items.library_items.filter(x => subjects.includes(x.subject));
    
    console.log(filtered);

    【讨论】:

      【解决方案3】:

      我在每个项目中都使用 lodash (https://lodash.com/docs)。他们构建了大量的方法和包装器,这将使您的生活更轻松。

       var items = {
       "library_items": 
          [
          {
              "id": "23453",
              "artifactID": "",
              "title":"Physics Basics",
              "subject": "Physics"
      
          },
          {
              "id": "23453",
              "artifactID": "",
              "title":"Chemistry Basics",
              "subject": "Biology"
      
          }
      
          ]
      };
      var subjects = ['Physics', 'Physics', 'Mathematics'];
      _.find(items["library_items"], function(o) { 
        return subjects.indexOf(o.subject) > -1; 
       });
      

      如果您不想安装其他软件包,我会选择 Agalo 的答案!

      【讨论】:

        【解决方案4】:

        如果性能对您很重要。我会向您建议另一种方法。

        使用 filter 和 indexOf(或包括),您的算法性能为 O(n*m)。对于每个图书馆项目,您需要浏览每个主题。

        如果您首先从主题数组创建一个简单的哈希表,您可以归档 O(n+m)。首先,您浏览每个主题并将其写入哈希表,然后对于每个图书馆项目,您可以使用 O(1)(因为哈希表)检查您是否需要该项目。

        下面是代码示例:

        var items = {
         "library_items": 
            [
            {
                "id": "23453",
                "artifactID": "",
                "title":"Physics Basics",
                "subject": "Physics"
        
            },
            {
                "id": "23453",
                "artifactID": "",
                "title":"Chemistry Basics",
                "subject": "Chemistry"
        
            }
        
            ]
        };
        var subjects = ['Physics', 'Biology', 'Mathematics'];
        var allSubjects = {};
        subjects.forEach(s => allSubjects[s] = true);
        var filtered = items.library_items.filter(x => allSubjects[x.subject]);
        console.log(filtered);

        【讨论】:

          【解决方案5】:
           result = obj.library_items.filter(o => subjects.indexOf(o.subject) > -1)
          

          【讨论】:

          • 请添加一些解释。仅代码的答案对未来的读者不太有用,并且不解释 OP 的错误或如何解决问题。目前,这个答案甚至都不正确。
          猜你喜欢
          • 1970-01-01
          • 2021-09-02
          • 2023-02-03
          • 2023-04-10
          • 2021-10-30
          • 2021-05-14
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多