【问题标题】:How do I get common items from 2 object in JavaScript?如何从 JavaScript 中的 2 个对象中获取常用项目?
【发布时间】:2015-08-08 23:52:48
【问题描述】:

我有 2 个像这样的对象数组:

数组 1

[{"id":1,"relationship_type_id":"3"},
{"id":2,"relationship_type_id":"2"},
{"id":3,"relationship_type_id":"1"},]

数组 2

[{"relationship_type_id":1,"contributing":"yes"},
{"relationship_type_id":2,"contributing":"no"},
{"relationship_type_id":3,"contributing":"yes"}]

我如何找出数组 1 中的哪个 ids 具有贡献的关系类型,即基于数组 2 贡献 == "yes"?

结果应如下所示:

结果 1

[{"id":1}, {"id":3}]

或者更进一步,只返回贡献关系的数量

结果 2

contributingRelationship = 2

【问题讨论】:

    标签: javascript arrays algorithm


    【解决方案1】:

    您可以像这样将.filter().some().map() 结合使用。

    如果arr2 特别大,您将受益于首先计算贡献类型并将它们保存在映射中以便在过滤arr1 期间更快地检索。

    var arr1 = [{"id":1,"relationship_type_id":"3"},
    {"id":2,"relationship_type_id":"2"},
    {"id":3,"relationship_type_id":"1"}];
    
    var arr2 = [{"relationship_type_id":1,"contributing":"yes"},
    {"relationship_type_id":2,"contributing":"no"},
    {"relationship_type_id":3,"contributing":"yes"}];
    
    var contributing = arr1.filter(function(item) {
      // filter based on whether arr2 has corresponding item
      return arr2.some(function(other_item) {
        return other_item.relationship_type_id == item.relationship_type_id && other_item.contributing == "yes";
      });
    }).map(function(item) {
      // map into final representation
      return {
        id: item.id
      };
    });
    
    console.log(contributing);

    【讨论】:

    • 这正是我正在寻找的解决方案——我一直想避免编写循环。
    【解决方案2】:

    这样的事情怎么样:

    (function(){
        var contributingIds = [];
        var result = [];
    
        var arr = [
            {"id":1,"relationship_type_id":"3"},
            {"id":2,"relationship_type_id":"2"},
            {"id":3,"relationship_type_id":"1"}
        ];
    
        var arr2 = [
            {"relationship_type_id":1,"contributing":"yes"},
            {"relationship_type_id":2,"contributing":"no"},
            {"relationship_type_id":3,"contributing":"yes"}
        ];
    
        arr2.forEach(function(item){
            if(item.contributing === 'yes'){
                contributingIds.push(item.relationship_type_id);
            }
        });
    
        arr.forEach(function(item){
            if(contributingIds.indexOf(parseInt(item.relationship_type_id, 10)) >= 0){
                result.push(item.id);
            }
        });
    
        console.log(result);
    })();
    

    【讨论】:

      【解决方案3】:

      你可以这样实现:

      var idarray = [{"id":1,"relationship_type_id":"3"},
      {"id":2,"relationship_type_id":"2"},
      {"id":3,"relationship_type_id":"1"},]; 
      
      
      var relarray = [{"relationship_type_id":1,"contributing":"yes"},
      {"relationship_type_id":2,"contributing":"no"},
      {"relationship_type_id":3,"contributing":"yes"}];
      
      var resultArray = [];
      
      for (var counter=0; counter < idarray.length; counter++) {
              for (var relarrayCounter =0; relarrayCounter < relarray.length; relarrayCounter++) {
                  if(idarray[counter].relationship_type_id== relarray[relarrayCounter].relationship_type_id) {
                     if (relarray[relarrayCounter].contributing == "yes") {
                         var resultObj = {};
                         resultObj.id = idarray[counter].relationship_type_id;
                         resultArray.push(resultObj);
                     }
                  }
      
              }
          }
      console.log("Result =", resultArray);
      console.log("Contributing relationship = ", resultArray.length);
      

      【讨论】:

        【解决方案4】:

        这也应该有效。

        var a = [{"id":1,"relationship_type_id":"3"},
                 {"id":2,"relationship_type_id":"2"},
                 {"id":3,"relationship_type_id":"1"},];
        
        var b = [{"relationship_type_id":1,"contributing":"yes"},
                 {"relationship_type_id":2,"contributing":"no"},
                 {"relationship_type_id":3,"contributing":"yes"}];
        var arr = [];
        for(var i=0;i<b.length;i++)
            for(var j=0;j<a.length;j++){
                if(b[i].contributing == "yes" && a[j].relationship_type_id == b[i].relationship_type_id){
                    arr.push({"id" : a[i].id});
        
                }
            }
        console.log(JSON.stringify(arr));
        

        Fiddle

        【讨论】:

          【解决方案5】:

          我使用了两个简单的 foreach 循环来遍历每组哈希,寻找指定的输入 id。我希望你觉得它有用。

              // initialize the arrays
              var id_to_relation = [{"id":1,"relationship_type_id":"3"},
              {"id":2,"relationship_type_id":"2"},
              {"id":3,"relationship_type_id":"1"}]
              var relation_to_contribute = [{"relationship_type_id":1,"contributing":"yes"},
              {"relationship_type_id":2,"contributing":"no"},
              {"relationship_type_id":3,"contributing":"yes"}]
              
              window.getRelation = function(id)
              {
                  var type = [];  // initialize relationship_type_id holder
                  var contributing = 0;  // current count of contributing ids
                  for (var hash in id_to_relation)
                  {
                      if (id_to_relation[hash]["id"] == id)
                      {
                          type.push(parseInt(id_to_relation[hash]["relationship_type_id"]));  // grab the related types
                      }
                  }
                  for (var hash in relation_to_contribute)
                  { 
                      if (type.indexOf(relation_to_contribute[hash]["relationship_type_id"]) > -1)
                      {
                          contributing += relation_to_contribute[hash]["contributing"] == "yes" ? 1 : 0;
                      }
                  }
                  document.getElementById("result").innerHTML = "contributingRelationship = " + contributing;
              }
          Enter requested id: <input type="number" id="thisId" />
          <br>
          <button type="button" onclick="getRelation(document.getElementById('thisId').value)">
            Check id
          </button>
          <h1>Result</h1>
          <p id="result"></p>

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-06
            • 1970-01-01
            • 2021-05-09
            • 2010-12-31
            • 2019-10-17
            • 2019-10-20
            • 2014-02-26
            相关资源
            最近更新 更多