简体   繁体   中英

How do I get common items from 2 object in JavaScript?

I have 2 object arrays like these:

Array 1

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

Array 2

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

How do I find out which ids in array 1 has a relationship type that is contributing ie contributing == "yes" based on array 2?

The results should look like this:

Result 1

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

Or further more, just returning the amount of contributing relationships

Result 2

contributingRelationship = 2

You could use .filter() in combination with .some() and .map() like so.

If arr2 is particularly big you would benefit from calculating the contributing types first and keeping them in a map for faster retrieval during the filtering of 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); 

How about something like this:

(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);
})();

You can achieve it this way:

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);

I used two simple foreach loops to go through each set of hashes, looking for a specified input id. I hope you find it useful.

  // 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> 

This should also work.

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 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM