2

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 i.e. 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
0

5 Answers 5

3

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

Sign up to request clarification or add additional context in comments.

1 Comment

This is exactly the solution I'm looking for - I always want to avoid writing loops.
2

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

Comments

0

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

Comments

0

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.

Comments

0

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>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.