Parse JSON object with multiple arrays based on specific value - javascript

I need to grab some guids out of a JSON object that has multiple arrays. I need some of the guids, but not all of them. I'm doing this in Javascript for a Postman test.
Specifically, I need to map a new array out of user.roles.org.guid, only for the guids where the user.roles.role is "teacher".
Example JSON:
{
"user": {
"guid": "foobar",
"status": "foobar",
"dateLastModified": "foobar",
"username": "foobar",
"enabledUser": "foobar",
"givenName": "foobar",
"familyName": "foobar",
"middleName": "foobar",
"email": "foobar",
"sms": "foobar",
"roles": [
{
"beginDate": "foobar",
"roleType": "foobar",
"role": "teacher",
"org": {
"href": "foobar",
"guid": "5C354F4D-DFD0-406D-8B83-7D5C8B64EF8B",
"type": "org"
}
},
{
"beginDate": "foobar",
"roleType": "foobar",
"role": "teacher",
"org": {
"href": "foobar",
"guid": "E2FECF7B-DA7B-4534-B467-337DEA01118C",
"type": "org"
}
},
{
"beginDate": "foobar",
"roleType": "foobar",
"role": "aide",
"org": {
"href": "foobar",
"guid": "E2F2B7C5-37A1-4D6C-8BB8-64E45CF71030",
"type": "org"
}
}
],
"grades": [
"12",
"12"
]
}
}
I have gotten as far as creating a new array for all guids under user.roles.org.guid:
var data = JSON.parse(responseBody)
var objectType = (data.user)
var guids = objectType.roles.org.map(guids => guids.guid)
...but I'm not sure how to limit that to just a role of teacher. Thanks!

To do so you need to filter() and then map() your filtered result.
let data = JSON.parse(responseBody);
let teacherGuids = data.user.roles
.filter(role => role.role === "teacher")
.map(teacherRole => teacherRole.org.guid);

data.user.roles.filter((e)=>{return e.role == "teacher"}).map((e)=>{return e.org.guid});

Related

How can I get the sites name data from JSON data

How can I get the sites name data value, with entire Formdata array?
Expected output:
["TEST-TRIAL-001120",
"Mubashir Test Site - 001001",
"TEST-TRIAL-001120",
"TEST SITE -001"]
const Formdata = [{
"id": "6efcf3f7-5d29-4a88-8ce9-346229a86765",
"title": "Deepak test form 2",
"version": "1",
"sites": [{
"id": "d7f2b290-2820-401a-a347-9a4dd05ec02b",
"name": "TEST-TRIAL-001120"
}],
"status": "Not Linked"
},
{
"id": "89e5a12d-913d-4f5d-a030-b172af9e27f0",
"title": "Deepak Test form 1",
"version": "1",
"sites": [],
"status": "Not Linked"
},
{
"id": "79a15768-762e-4ff8-b565-31274a38b22d",
"title": "1.7 Form",
"version": "1",
"sites": [{
"id": "32369d1d-f247-4a75-8c14-490c8393dbb8",
"name": "Mubashir Test Site - 001001"
}, {
"id": "d7f2b290-2820-401a-a347-9a4dd05ec02b",
"name": "TEST-TRIAL-001120"
}, {
"id": "a6526163-3ed7-4125-8f32-e0066fc6fe24",
"name": "TEST SITE -001"
}],
"status": "Not Linked"
}
]
Formdata.map(form => {
console.log(form.sites); //not understand how to get sites name data value
});
map over the site array to get an array of names, then flattening that array.
const Formdata=[{id:"6efcf3f7-5d29-4a88-8ce9-346229a86765",title:"Deepak test form 2",version:"1",sites:[{id:"d7f2b290-2820-401a-a347-9a4dd05ec02b",name:"TEST-TRIAL-001120"}],status:"Not Linked"},{id:"89e5a12d-913d-4f5d-a030-b172af9e27f0",title:"Deepak Test form 1",version:"1",sites:[],status:"Not Linked"},{id:"79a15768-762e-4ff8-b565-31274a38b22d",title:"1.7 Form",version:"1",sites:[{id:"32369d1d-f247-4a75-8c14-490c8393dbb8",name:"Mubashir Test Site - 001001"},{id:"d7f2b290-2820-401a-a347-9a4dd05ec02b",name:"TEST-TRIAL-001120"},{id:"a6526163-3ed7-4125-8f32-e0066fc6fe24",name:"TEST SITE -001"}],status:"Not Linked"}];
const result = Formdata.flatMap(({ sites }) => {
return sites.map(({ name }) => name);
});
console.log(result);
Additional documentation
Destructuring assignment
I use the flatMap and map
const Formdata = [{ "id": "6efcf3f7-5d29-4a88-8ce9-346229a86765", "title": "Deepak test form 2", "version": "1", "sites": [{ "id": "d7f2b290-2820-401a-a347-9a4dd05ec02b", "name": "TEST-TRIAL-001120" }], "status": "Not Linked" }, { "id": "89e5a12d-913d-4f5d-a030-b172af9e27f0", "title": "Deepak Test form 1", "version": "1", "sites": [], "status": "Not Linked" }, { "id": "79a15768-762e-4ff8-b565-31274a38b22d", "title": "1.7 Form", "version": "1", "sites": [{ "id": "32369d1d-f247-4a75-8c14-490c8393dbb8", "name": "Mubashir Test Site - 001001" }, { "id": "d7f2b290-2820-401a-a347-9a4dd05ec02b", "name": "TEST-TRIAL-001120" }, { "id": "a6526163-3ed7-4125-8f32-e0066fc6fe24", "name": "TEST SITE -001" }], "status": "Not Linked" } ];
const sites = Formdata.flatMap(({sites}) => sites.map(({name}) => name))
console.log(sites)
First map the sites names from each form. This leaves you with an array of arrays which you need to flatten, which can be done with concat or flatMap
const Formdata = [{"id": "6efcf3f7-5d29-4a88-8ce9-346229a86765","title": "Deepak test form 2","version": "1","sites": [{"id": "d7f2b290-2820-401a-a347-9a4dd05ec02b","name": "TEST-TRIAL-001120"}],"status": "Not Linked"},{"id": "89e5a12d-913d-4f5d-a030-b172af9e27f0","title": "Deepak Test form 1","version": "1","sites": [], "status": "Not Linked"},{"id": "79a15768-762e-4ff8-b565-31274a38b22d","title": "1.7 Form","version": "1","sites": [{"id": "32369d1d-f247-4a75-8c14-490c8393dbb8","name": "Mubashir Test Site - 001001"}, {"id": "d7f2b290-2820-401a-a347-9a4dd05ec02b","name": "TEST-TRIAL-001120"}, {"id": "a6526163-3ed7-4125-8f32-e0066fc6fe24","name": "TEST SITE -001"}],"status": "Not Linked"}]
let sites = [].concat.apply([],
Formdata.map(data =>
data.sites.map(site => site.name)
)
)
/*let sites = Formdata.map(data =>
data.sites.map(site => site.name)
).flatMap(x=>x)*/
console.log(sites)

how to remove this object from array inside of object in array?

I am not sure how to form this question, but I will do my best.
I don't know how to remove object by _id from 'list:' part.
So, I have one array, and inside of that array I have list of objects,inside of these objects I have again array with objects, so I want to remove one object from that last array, how I can do that?
Cannot fix it for 2 days, I'm stucked!
Thanks!
[
{
"_id": "599a1344bf50847b0972a465",
"title": "British Virgin Islands BC",
"list": [],
"price": "1350"
},
{
"_id": "599a1322bf50847b0972a38e",
"title": "USA (Nevada) LLC",
"list": [
{
"_id": "599a1322bf50847b0972a384",
"title": "Nominee Member",
"service": "nominee-service",
"price": "300"
},
{
"_id": "599a1322bf50847b0972a385",
"title": "Nominee Manager & General Power of Attorney (Apostilled)",
"service": "nominee-service",
"price": "650"
},
{
"_id": "599a1322bf50847b0972a386",
"title": "Special Power of Attorney",
"service": "nominee-service",
"price": "290"
}
],
"price": "789"
},
{
"_id": "599a12fdbf50847b0972a2ad",
"title": "Cyprus LTD",
"list": [
{
"_id": "599a12fdbf50847b0972a2a5",
"title": "Nominee Shareholder",
"service": "nominee-service",
"price": "370"
},
{
"_id": "599a12fdbf50847b0972a2a6",
"title": "Nominee Director & General Power or Attorney (Apostilled)",
"service": "nominee-service",
"price": "720"
},
{
"_id": "599a12fdbf50847b0972a2ab",
"title": "Extra Rubber Stamp",
"service": "other-service",
"price": "40"
}
],
"price": "1290"
}
]
Using Vanilla JS:
function findAndRemove(data, id) {
data.forEach(function(obj) { // Loop through each object in outer array
obj.list = obj.list.filter(function(o) { // Filter out the object with unwanted id, in inner array
return o._id != id;
});
});
}
var data = [{
"_id": "599a1344bf50847b0972a465",
"title": "British Virgin Islands BC",
"list": [],
"price": "1350"
},
{
"_id": "599a1322bf50847b0972a38e",
"title": "USA (Nevada) LLC",
"list": [{
"_id": "599a1322bf50847b0972a384",
"title": "Nominee Member",
"service": "nominee-service",
"price": "300"
},
{
"_id": "599a1322bf50847b0972a385",
"title": "Nominee Manager & General Power of Attorney (Apostilled)",
"service": "nominee-service",
"price": "650"
},
{
"_id": "599a1322bf50847b0972a386",
"title": "Special Power of Attorney",
"service": "nominee-service",
"price": "290"
}
],
"price": "789"
},
{
"_id": "599a12fdbf50847b0972a2ad",
"title": "Cyprus LTD",
"list": [{
"_id": "599a12fdbf50847b0972a2a5",
"title": "Nominee Shareholder",
"service": "nominee-service",
"price": "370"
},
{
"_id": "599a12fdbf50847b0972a2a6",
"title": "Nominee Director & General Power or Attorney (Apostilled)",
"service": "nominee-service",
"price": "720"
},
{
"_id": "599a12fdbf50847b0972a2ab",
"title": "Extra Rubber Stamp",
"service": "other-service",
"price": "40"
}
],
"price": "1290"
}
];
// Empty almost all of list, except middle one
findAndRemove(data, "599a1322bf50847b0972a384");
findAndRemove(data, "599a1322bf50847b0972a386");
findAndRemove(data, "599a12fdbf50847b0972a2a5");
findAndRemove(data, "599a12fdbf50847b0972a2a6");
findAndRemove(data, "599a12fdbf50847b0972a2ab");
console.log(data);
Cleared everything except middle list, just for better visualization.
#Abhijit Kar your one is working perfectly, thanks mate!
How I can later splice this list?
When I was working with objects from first array, I did it like this :
var inventory = jsonArrayList;
for (var i = 0; i < inventory.length; i++) {
if (inventory[i]._id == deleteProductById) {
vm.items.splice(i, 1);
break;
}
}
It would be very helpful, thanks alot!
You can use Array.map and Array.filter to accomplish this. Detailed explanation in comments:
PS: This snippet uses ES6 arrow functions and spread operator
function removeById(arr, id) {
// Array.map iterates over each item in the array,
// and executes the given function on the item.
// It returns an array of all the items returned by the function.
return arr.map(obj => {
// Return the same object, if the list is empty / null / undefined
if (!obj.list || !obj.list.length) return obj;
// Get a new list, skipping the item with the spedified id
const newList = obj.list.filter(val => val._id !== id);
// map function returns the new object with the filtered list
return { ...obj, list: newList };
});
}
const oldArray = <YOUR_ORIGINAL_ARRAY>;
const newArray = removeById(arr, "599a12fdbf50847b0972a2a5");

Javascript array value undefined?

I am currently working on a REST API / website project, where my REST API has to return an array of objects from the server, via a response and using GSON to make a Json array out of the data. However, when trying to get values from the javascript array for the website, I keep getting undefined. This is the array:
var userArr =[
{
"0x1": {
"firstName": "Test1",
"lastName": "Test1",
"hobbies": [
{
"id": 1,
"name": "Fodbold",
"people": [
"0x1"
]
}
],
"id": 1,
"address": {
"id": 1,
"street": "Street1",
"cityInfo": {
"id": 1,
"zipCode": "0555",
"city": "Scanning"
},
"infoList": [
"0x1",
"0x2"
]
},
"phones": [
{
"id": 1,
"number": "123124",
"info": "0x1"
}
]
}
];
When I try to call userArr[0].firstName, I get an error saying that it's undefined, even though the data is there. This is from a get call, which I am doing in my javascript from my REST API, which sends back this specific array. I have tried looping through the array, with multiple objects inside, however I am unable to retrieve any info at all.
Your userArr is an array of objects which do not have firstName property. They have only one property named 0x1 for some reason. And this 0x1 property has firstName property.
You can access firstName of 0x1 property using this notation:
userArr[0]["0x1"].firstName
Here is the working demo:
var userArr = [{
"0x1": {
"firstName": "Test1",
"lastName": "Test1",
"hobbies": [{
"id": 1,
"name": "Fodbold",
"people": [
"0x1"
]
}],
"id": 1,
"address": {
"id": 1,
"street": "Street1",
"cityInfo": {
"id": 1,
"zipCode": "0555",
"city": "Scanning"
},
"infoList": [
"0x1",
"0x2"
]
},
"phones": [{
"id": 1,
"number": "123124",
"info": "0x1"
}]
}
}];
console.log(userArr[0]["0x1"].firstName);
By the way, there is a missing closing } bracket in the end of the array in your code.
I think if you write this code this way it is easy to understand and find the problem
var userArr =[
{
"0x1": {
"firstName": "Test1",
"lastName": "Test1",
"hobbies": [{"id": 1,"name": "Fodbold","people": ["0x1"]}],
"id": 1,
"address": {"id": 1,"street": "Street1","cityInfo": {"id": 1,"zipCode": "0555","city": "Scanning"},
"infoList": ["0x1","0x2"]},
"phones": [{"id": 1,"number": "123124","info": "0x1"}]
}
}
];
You also missing the last second bracket.
Then you could use this console.log(userArr[0]["0x1"].firstName);
try this one
userArr[0]["0x1"].firstName
Incase value "0x1" is dynamic, you can access it by using Object.keys(userArr[0])[0] to get the first key of the object.
Here is solution:
var userArr = [{
"0x1": {
"firstName": "Test1",
"lastName": "Test1",
"hobbies": [{
"id": 1,
"name": "Fodbold",
"people": [
"0x1"
]
}],
"id": 1,
"address": {
"id": 1,
"street": "Street1",
"cityInfo": {
"id": 1,
"zipCode": "0555",
"city": "Scanning"
},
"infoList": [
"0x1",
"0x2"
]
},
"phones": [{
"id": 1,
"number": "123124",
"info": "0x1"
}]
}
}];
console.log(userArr[0][Object.keys(userArr[0])[0]].firstName);

Checking a value in a nested JSON using Postman

I have a nested JSON returned from an API that I am hitting using a GET request, in POSTMAN chrome app. My JSON looks like this
"result": [
{
"_id": "some_id",
"name": "India",
"code": "IN",
"link": "http://www.india.info/",
"closingTime": "2017-02-25T01:12:17.860Z",
"openingTime": "2017-02-25T06:12:17.205Z",
"image": "image_link",
"status": "online",
"serverStatus": "online",
"games": [
{
"_id": "some_game_id1",
"name": "Cricket"
},
{
"_id": "some_another_id1",
"name": "Baseball"
},
{
"_id": "some_another_id_2",
"name": "Basketball"
}
]
},
{
"_id": "some_id",
"name": "Australia",
"code": "AUS",
"link": "https://www.lonelyplanet.com/aus/adelaide",
"closingTime": "2017-02-28T05:13:38.022Z",
"openingTime": "2017-02-28T05:13:38.682Z",
"image": "some_image_url",
"status": "offline",
"serverStatus": "online",
"games": [
{
"_id": "some_game_id_2",
"name": "Cricket"
},
{
"_id": "some_another_id_3",
"name": "Kho-Kho"
},
{
"_id": "some_another_id_4",
"name": "Badminton"
},
{
"_id": "some_another_id_5",
"name": "Tennis"
}
]
},
I am trying to test whether my response body has "name":"India" and the "game" with "some_game_id1" contains the "name":"cricket".
I went through this link where the answer is to have an array for "name"created and then check within the array whether the array contains the value. I tried this but my code fails.
Also, I tried searching the element by the index within the JSON body using this -
var searchJSON = JSON.parse(responseBody);
tests["name contains India"] = searchJSON.result.name[0]==="India";
But this also fails. I tried using the .value appended with the second line of above code, but it also fails. How can I check this thing?
You need to put [0] after result (which is an array) rather than name (which is a string).
Also, use a regular expression to check whether the name contains 'India', because using === only checks if the name is exactly India.
var searchJSON = JSON.parse(responseBody)
tests["name contains India"] = /India/.test(searchJSON.result[0].name)
Demo Snippet:
var responseBody = `{
"result": [{
"_id": "some_id",
"name": "India",
"code": "IN",
"link": "http://www.india.info/",
"closingTime": "2017-02-25T01:12:17.860Z",
"openingTime": "2017-02-25T06:12:17.205Z",
"image": "image_link",
"status": "online",
"serverStatus": "online",
"games": [{
"_id": "some_game_id1",
"name": "Cricket"
},
{
"_id": "some_another_id1",
"name": "Baseball"
},
{
"_id": "some_another_id_2",
"name": "Basketball"
}
]
},
{
"_id": "some_id",
"name": "Australia",
"code": "AUS",
"link": "https://www.lonelyplanet.com/aus/adelaide",
"closingTime": "2017-02-28T05:13:38.022Z",
"openingTime": "2017-02-28T05:13:38.682Z",
"image": "some_image_url",
"status": "offline",
"serverStatus": "online",
"games": [{
"_id": "some_game_id_2",
"name": "Cricket"
},
{
"_id": "some_another_id_3",
"name": "Kho-Kho"
},
{
"_id": "some_another_id_4",
"name": "Badminton"
},
{
"_id": "some_another_id_5",
"name": "Tennis"
}
]
}
]
}`
var tests = {}
var searchJSON = JSON.parse(responseBody)
tests["name contains India"] = /India/.test(searchJSON.result[0].name)
console.log(tests) //=> { "name contains India": true }

JavaScript - Loop JSON array and match string in subarray

I have JSON array with subarrays and I want to loop it and find if username of user is for example 'admin'. If so then create JSON array contains data belonging to user 'admin' (region, sport, city etc). I don't have idea how to find it in loop and then slice it. I'm sorry for stupid question but I'm a little lost.
This is JSON array with structure what I have:
[
{
"_id": "5520f52e2c0a22541541bde1",
"region": {
"_id": "551e6779d8f1afa01bd86529",
"name": "region_name"
},
"user": {
"_id": "551a938af056a7fc099879c1",
"firstName": "John",
"lastName": "Boo",
"username": "admin",
"id": "551a938af056a7fc099879c1"
},
"__v": 0,
"sport": [
{
"_id": "551e69c6d8f1afa01bd86533",
"name": "Running"
}
],
"city": "some_city",
"advert": "some_advert",
"title": "I want to run!",
"created": "2015-04-05T08:41:18.173Z"
},
{
"_id": "552010740628cab002b3a700",
"region": {
"_id": "551e67b6d8f1afa01bd8652f",
"name": "region_name"
},
"user": {
"_id": "551a938af056a7fc099879c1",
"firstName": "Bill",
"lastName": "Foo",
"username": "bill_foo",
"id": "551a938af056a7fc099879c1"
},
"__v": 0,
"sport": [
{
"_id": "551e5e01abb74a8423410b88",
"nazev": "Hockey"
}
],
"city": "some_city",
"advert": "some_advert",
"title": "some_title",
"created": "2015-04-04T16:25:24.733Z"
}
]
Edit:
the expected result of user 'admin' is then:
[
{
"_id": "5520f52e2c0a22541541bde1",
"region": {
"_id": "551e6779d8f1afa01bd86529",
"name": "region_name"
},
"user": {
"_id": "551a938af056a7fc099879c1",
"firstName": "John",
"lastName": "Boo",
"username": "admin",
"id": "551a938af056a7fc099879c1"
},
"__v": 0,
"sport": [
{
"_id": "551e69c6d8f1afa01bd86533",
"name": "Running"
}
],
"city": "some_city",
"advert": "some_advert",
"title": "I want to run!",
"created": "2015-04-05T08:41:18.173Z"
}]
Loop through the array and pull out each item with a user with a username of admin:
var result = [];
var nameToSearchFor = 'admin';
for(var index = 0; index < arr.length; index++)
{
var item = arr[index];
if(item.user.username === nameToSearchFor)
{
result.push(item);
}
}
One solution to your problem is to search for the index that resides the admin username. In your case is at the 0 index of the json array provided. So you can get the entire object by the index, like this:
var i = 0;
for(; i< json.length; i++){
if(json[i].user.username === "admin") break;
}
With that now you can get the object with the admin data. Like this:
json[i].user.firstName
Check this plunk here
EDIT
If you want just to get that slice to a new array perhaps then you can just slice that piece of the json array, now that you have the index.
var newArray = json.slice(i, i+1);
You can use an open source project like jinqJs to perform SQL like queries on arrays.
var data = [
{
"_id": "5520f52e2c0a22541541bde1",
"region": {
"_id": "551e6779d8f1afa01bd86529",
"name": "region_name"
},
"user": {
"_id": "551a938af056a7fc099879c1",
"firstName": "John",
"lastName": "Boo",
"username": "admin",
"id": "551a938af056a7fc099879c1"
},
"__v": 0,
"sport": [
{
"_id": "551e69c6d8f1afa01bd86533",
"name": "Running"
}
],
"city": "some_city",
"advert": "some_advert",
"title": "I want to run!",
"created": "2015-04-05T08:41:18.173Z"
},
{
"_id": "552010740628cab002b3a700",
"region": {
"_id": "551e67b6d8f1afa01bd8652f",
"name": "region_name"
},
"user": {
"_id": "551a938af056a7fc099879c1",
"firstName": "Bill",
"lastName": "Foo",
"username": "bill_foo",
"id": "551a938af056a7fc099879c1"
},
"__v": 0,
"sport": [
{
"_id": "551e5e01abb74a8423410b88",
"nazev": "Hockey"
}
],
"city": "some_city",
"advert": "some_advert",
"title": "some_title",
"created": "2015-04-04T16:25:24.733Z"
}
];
var result = jinqJs()
.from(data)
.where(function(row){return row.user.username==='admin';})
.select();
document.body.innerHTML = '<pre>' + JSON.stringify(result, null, 4) + '</pre><br><br>';
<script src="https://rawgit.com/fordth/jinqJs/master/jinqjs.js"></script>

Categories