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.