issue with getting JSON child values by specifying full path - javascript

I have the below JSON response
{
"r": [{
"IsDefault": false,
"re": {
"Name": "Depo"
},
"Valid": "Oct8, 2013",
"Clg":[ {
"Name": "james",
"Rate": 0.05
},
{
"Name": "Jack",
"Rate": 0.55
},
{
"Name": "Mcd",
"Rate": 0.01,
}],
},
{
"IsDefault": false,
"re": {
"Name": "Depo"
},
"Valid": "Oct8, 2013",
"Clg": [{
"Name": "james",
"Rate": 0.05
},
{
"Name": "Jack",
"Rate": 0.55
},
{
"Name": "Mcd",
"Rate": 0.01,
}],
},
{
"IsDefault": false,
"re": {
"Name": "Depo"
},
"Valid": "Oct8, 2013",
"Clg": [{
"Name": "james",
"Rate": 0.05
},
{
"Name": "Jack",
"Rate": 0.55
},
{
"Name": "Mcd",
"Rate": 0.01,
}],
}]
}
I am using $.getJSON method to loads JSON data and adding it in collection by checking whether it is array as below . It is working fine as expected.
var res = loadFromJson(result.r);
loadFromJson = function(input) {
if (_.isArray(input)) {
console.log("Inside Array");
var collection = new CompeCollection();
_.each(input, function(modData) {
collection.add(loadFromJson(modData));
console.log("collection length:"+modData.length);
});
return collection;
}
};
But when i try to specify the exact path(r.Clg) of my JSON response it is not even coming to above if condition though it is valid response.
var res = loadFromJson(result.r.Clg);
loadFromJson = function(input) {
if (_.isArray(input)) {
console.log("Inside Array");
var collection = new CompeCollection();
_.each(input, function(modData) {
collection.add(loadFromJson(modData));
console.log("collection length:"+modData.length);
});
return collection;
}
};
What should i do when i need to specify actual or full path?
Can any one tell me what could be the problem when i pass more specific json values?
Thanks in advance.

result.r.Clg doesn't exist. result.r is an array.
If you only wanted to access the first object in the r array, you would do this:
var res = loadFromJson(result.r);
var clg = res[0].Clg;
Or you could loop over all the objects, perhaps capturing all the Clgs in one array:
var clgs = res.map(function (obj) { return obj.Clg; }, []);

Related

How can a create another array from my javascript array

I'm working with an array from an api call, which I would like to rearrange for something else.
payload = [
{
"id": rexiy,
"orderLabel": "PREP",
"balance": 1900,
"virtual": false,
"type": "credit",
},
{
"id": erptq,
"orderLabel": "PREP",
"balance": 500,
"virtual": true,
"type": "debit"
}
]
I'm trying to create a new array that would have this format
array = [
{
rexiy:1900
},
{
erptq:500
}
]
How do I go about it
You can use object destructuring and map to do this:
const payload = [{
"id": "rexiy",
"orderLabel": "PREP",
"balance": 1900,
"virtual": false,
"type": "credit",
},
{
"id": "erptq",
"orderLabel": "PREP",
"balance": 500,
"virtual": true,
"type": "debit"
}
]
const result = payload.map(({id, balance}) => ({
[id]: balance
}));
console.log(result);

Filter data from Json to new Array which can be used in HighChartsJs

I am currently working with HighCharts JS. For data to be shown in HighCharts, I must have the final data as follows:
[
{
name: 'Performing',
data: [1941404, 1028717, 697370, 0, 0, 0]
},
{
name: 'Non performing',
data: [0, 0, 0, 1759908, 890857, 280235]
},
{
name: 'Substandard',
data: [0, 0, 863825, 0, 0, 0]
},
{
name: 'Written-off',
data: [0, 0, 0, 0, 0, 77146]
}
]
'Data' is an array of 6 objects which populate the xAxis of the chart.
However, I have the following data which is being supplied via MongoDb
const chartData = [
{
"_id": {
"data": "90 - 180",
"status": "Non Performing"
},
"value": 1759908
},
{
"_id": {
"data": "360",
"status": "Written-off"
},
"value": 77146
},
{
"_id": {
"data": "360",
"status": "Non Performing"
},
"value": 280235
},
{
"_id": {
"data": "30 - 90",
"status": "Substandard"
},
"value": 863825
},
{
"_id": {
"data": "30 - 90",
"status": "Performing"
},
"value": 697370
},
{
"_id": {
"data": "180 - 360",
"status": "Non Performing"
},
"value": 890857
},
{
"_id": {
"data": "0 - 30",
"status": "Performing"
},
"value": 1028717
},
{
"_id": {
"data": "0",
"status": "Performing"
},
"value": 1941404
}
]
I need to filter through the latter code so it ends up like the former code. It is very important that in the data array, we end up with 6 objects to make sure we populate the entire xAxis of Highcharts, hence we see lots of zeros, where no data was supplied.
I really hope this clears things up. Thank you to all those who have help. I apologise for being so vague from the offset.
QUICK NOTE The order of the data array is as follows: 0, 0-30, 30-90, 90-180, 180-360, 360
EDITTED
So this is the code I am using at the moment:
const data = this.chartData
let series
series = Object.values(data.reduce((acc, currVal) => {
acc[currVal._id.status] = acc[currVal._id.status] || {
name: currVal._id.status,
data: []
};
acc[currVal._id.status].data.push(currVal.totalBookValue) //push the year to data array after converting the same to a Number
return acc //return the accumulator
}, {}))
This kind of works, but its not populating the Data array with 6 elements.
Your problem can be solved via a bit of traversal using reduce() to reach object form and map() to return to array form (assuming the 0 to 360 list you posted is complete).
See below for a practical example.
// Input.
const input = [
{
"_id": {
"data": "90 - 180",
"status": "Non Performing"
},
"value": 1759908
},
{
"_id": {
"data": "360",
"status": "Written-off"
},
"value": 77146
},
{
"_id": {
"data": "360",
"status": "Non Performing"
},
"value": 280235
},
{
"_id": {
"data": "30 - 90",
"status": "Substandard"
},
"value": 863825
},
{
"_id": {
"data": "30 - 90",
"status": "Performing"
},
"value": 697370
},
{
"_id": {
"data": "180 - 360",
"status": "Non Performing"
},
"value": 890857
},
{
"_id": {
"data": "0 - 30",
"status": "Performing"
},
"value": 1028717
},
{
"_id": {
"data": "0",
"status": "Performing"
},
"value": 1941404
}
]
// Depth.
const depth = ['0', '0 - 30', '30 - 90', '90 - 180', '180 - 360', '360']
// Object Form.
const objectform = input.reduce((accumulator, x) => {
const { _id, value } = x // _id. Value.
let { data, status } = _id // Status.
status = status.toLowerCase() // Lower Case.
const point = {...accumulator[status], [data]: value} // Data.
return {...accumulator, [status]: point} // Update + Return Accumulator.
}, {})
// Output.
const output = Object.keys(objectform).map((key) => {
return {
name: key, // Name.
data: depth.map((frame) => objectform[key][frame] || 0) // Data.
}
})
// Log.
console.log(output)

How to structure my json value that got pushed to array in angular.js

This is my punker
I can get the selected values pushed to array by ngcheck and ngchange, but I want to push the {{get_ing_value.productName}} to array when I click any of the checkbox and radio button.
This is what I have:
[
{
"selected": {
"_id": "584aa4e218c5b62c02b6fe6a",
"productId": "584aa4e118c5b62c02b6fe67",
"ingredientTypeId": "5822f17b24baa627770af5ed",
"ingredientName": "small",
"slug": "small",
"isActive": true,
"ingredientPrice": -75
}
},
{
"selected": {
"_id": "584aa4e718c5b62c02b6fe6e",
"productId": "584aa4e118c5b62c02b6fe67",
"ingredientTypeId": "5822f18324baa627770af5ee",
"ingredientName": "extra cheese",
"slug": "extra-cheese",
"isActive": true,
"ingredientPrice": 20
}
},
{
"selected": "{\"_id\":\"584aa4e918c5b62c02b6fe70\",\"productId\":\"584aa4e118c5b62c02b6fe67\",\"ingredientTypeId\":\"5822f19724baa627770af5ef\",\"ingredientName\":\"hot chilly\",\"slug\":\"hot-chilly\",\"isActive\":true,\"ingredientPrice\":20}"
},
{
"selected": "{\"_id\":\"584aa4ea18c5b62c02b6fe71\",\"productId\":\"584aa4e118c5b62c02b6fe67\",\"ingredientTypeId\":\"5822f1a024baa627770af5f0\",\"ingredientName\":\"chicken\",\"slug\":\"chicken\",\"isActive\":true,\"ingredientPrice\":50}"
}
]
This is what I want to get
[
{
"main_product_name": "PIZAA"
},
{
"selected": {
"_id": "584aa4e218c5b62c02b6fe6a",
"productId": "584aa4e118c5b62c02b6fe67",
"ingredientTypeId": "5822f17b24baa627770af5ed",
"ingredientName": "small",
"slug": "small",
"isActive": true,
"ingredientPrice": -75
}
},
{
"selected": {
"_id": "584aa4e718c5b62c02b6fe6e",
"productId": "584aa4e118c5b62c02b6fe67",
"ingredientTypeId": "5822f18324baa627770af5ee",
"ingredientName": "extra cheese",
"slug": "extra-cheese",
"isActive": true,
"ingredientPrice": 20
}
},
{
"selected": "{\"_id\":\"584aa4e918c5b62c02b6fe70\",\"productId\":\"584aa4e118c5b62c02b6fe67\",\"ingredientTypeId\":\"5822f19724baa627770af5ef\",\"ingredientName\":\"hot chilly\",\"slug\":\"hot-chilly\",\"isActive\":true,\"ingredientPrice\":20}"
},
{
"selected": "{\"_id\":\"584aa4ea18c5b62c02b6fe71\",\"productId\":\"584aa4e118c5b62c02b6fe67\",\"ingredientTypeId\":\"5822f1a024baa627770af5f0\",\"ingredientName\":\"chicken\",\"slug\":\"chicken\",\"isActive\":true,\"ingredientPrice\":50}"
}
]
You can try this code, may be it helps you. It will set PIZZA as main_product_name in first index of your array when you select any radio or checkbox, it will also check if main_product_name is already added.
var App = angular.module('App', []);
App.controller('TodoCtrl', function($scope, $http) {
$scope.get_product_ingredients;
$http.get('https://api.myjson.com/bins/1gh1pl').then(function(res) {
$scope.get_product_ingredients = res.data;
});
$scope.selected_ingrediants = [];
$scope.tempCheck = {};
$scope.formatted = [];
$scope.get = function() {
if(!$scope.formatted[0]){
$scope.formatted[0] = {
main_product_name: $scope.get_product_ingredients[0].productName
}
}
};
$scope.updateIngredient = function(type, model, index){
if(!$scope.formatted[0]){
$scope.formatted[0] = {
main_product_name: $scope.get_product_ingredients[0].productName
}
}
$scope.formatted[index+1] = {
//ingredientTypeName: type,
selected: model
}
}
});

Compare two arrays of objects and filter results

Example:
const depositAddress = '2NBXPR5PRtW8xBRuDnWXBDXqHYpDPupWnhG';
DBarray1.forEach( (tx) => {
console.log(tx);
})
TXarray2.forEach( (sim) => {
console.log(sim);
});
DBarray1 = [
{
"_id": "575e2b7875a402111900ba8f",
"username": "aleluia#gmail.com",
"playerWallet": "2NFt8YfydBU5JD9U8Xq2ucbfUp2sP7BjUrh",
"User_Profile": {
"TXHash": [
"7fbe28f75412f19dfd123a08ce03c33c302aa13d1e68d38ab8cb4c7418777f8e"
]
}
},
{
"_id": "575e2946b909906a17ea65b9",
"username": "super#user.com",
"playerWallet": "2MzppxEX7xMidjhoJGczFDYsHk5TQwFkjS3",
"User_Profile": {
"TXHash": [
"cf948340a40d3302303dfb3710cfce37bb1cd156dcb6c74561fdc71c0a8fc30b",
"6219def49d2e8284a6031f4c7e05e21adf756d38904e6359bd7844ae14c75a50"
]
}
}
] // end console.log(DBarray1);
TXarray2 = [
{
"id": "cf948340a40d3302303dfb3710cfce37bb1cd156dcb6c74561fdc71c0a8fc30b",
"normalizedHash": "f62af1a61c7eb569c1a171ad23c70bc218bd7244c9c5c92cf7d98638314fbbc5",
"date": "2016-06-21T04:11:18.541Z",
"fee": 6280,
"inputs": [
{
"previousHash": "2660fb761354671912b0cea6427e9ee91a98a507e5f1408865a6058b566b508c",
"previousOutputIndex": 0
},
{
"previousHash": "ce3ef138c11ea4d1766cce52ccf5f1e91790bc03b56561b0eb669041bae4e1a3",
"previousOutputIndex": 0
}
],
"outputs": [
{
"vout": 0,
"account": "2N92kApgroS6CTVuTajtjWtpcAZpUiyQoDT",
"value": 861003
},
{
"vout": 1,
"account": "2NBXPR5PRtW8xBRuDnWXBDXqHYpDPupWnhG",
"value": 3100000,
"isMine": true,
"chain": 0,
"chainIndex": 0
}
],
"entries": [
{
"account": "2MzppxEX7xMidjhoJGczFDYsHk5TQwFkjS3",
"value": -3967283
},
{
"account": "2N92kApgroS6CTVuTajtjWtpcAZpUiyQoDT",
"value": 861003
},
{
"account": "2NBXPR5PRtW8xBRuDnWXBDXqHYpDPupWnhG",
"value": 3100000
}
],
"confirmations": 70,
"pending": false,
"instant": true,
"instantId": "5768be65427689eb06e597559c7e6cf0",
"blockhash": "00000000002d9fb51c7c3c1607fe062eff686aa6be657a59fee6c3044963897d",
"height": 872152
},
{
"id": "6219def49d2e8284a6031f4c7e05e21adf756d38904e6359bd7844ae14c75a50",
"normalizedHash": "179a4466fdfc5470e99e43aa177d43aa4f09e3a06760fd5bebffdda080d4407f",
"date": "2016-06-21T04:13:23.650Z",
"fee": 9096,
"inputs": [
{
"previousHash": "5d2879a79ea3d0dcb50049ef9ca46ef7e8d82caf2073a299a6cd0332add404c8",
"previousOutputIndex": 1
},
{
"previousHash": "d75288e69a3fc2edd534ddcd845af6a280a27af58013ae82828c8a8f813829c1",
"previousOutputIndex": 0
},
{
"previousHash": "eea4f9b274708b60c1b030203543a155857bc54aa11055ada04aceee706f96b9",
"previousOutputIndex": 0
}
],
"outputs": [
{
"vout": 0,
"account": "2NBXPR5PRtW8xBRuDnWXBDXqHYpDPupWnhG",
"value": 2000000,
"isMine": true,
"chain": 0,
"chainIndex": 0
},
{
"vout": 1,
"account": "2MzFTm5jnCDiAapjNnyVgZAJrXMKfQ74esV",
"value": 9859
}
],
"entries": [
{
"account": "2MzcwVFKF274bMNT5tNEDY7Ua7bAgvFUdu9",
"value": -35316
},
{
"account": "2MzFTm5jnCDiAapjNnyVgZAJrXMKfQ74esV",
"value": 9859
},
{
"account": "2MzppxEX7xMidjhoJGczFDYsHk5TQwFkjS3",
"value": -1983639
},
{
"account": "2NBXPR5PRtW8xBRuDnWXBDXqHYpDPupWnhG",
"value": 2000000
}
],
"confirmations": 70,
"pending": false,
"instant": true,
"instantId": "5768bee2b5bdf3f406e7db035aef016a",
"blockhash": "00000000002d9fb51c7c3c1607fe062eff686aa6be657a59fee6c3044963897d",
"height": 872152
},
{
"id": "7fbe28f75412f19dfd123a08ce03c33c302aa13d1e68d38ab8cb4c7418777f8e",
"normalizedHash": "b4f1974dccde5ea9dfb0abcd7d4a6f3f14995d9dd422aa7d2a9078229ff18ff4",
"date": "2016-06-21T03:39:25.034Z",
"fee": 3465,
"inputs": [
{
"previousHash": "97fbb6ed8646f7ce9ed10a4230a70348151d5b6b208ad068e3a1a3fddae2dc0e",
"previousOutputIndex": 2
}
],
"outputs": [
{
"vout": 0,
"account": "2NBXPR5PRtW8xBRuDnWXBDXqHYpDPupWnhG",
"value": 111200000,
"isMine": true,
"chain": 0,
"chainIndex": 0
},
{
"vout": 1,
"account": "2NFJnLrhsCDfG3ooQvGC169gnzBabtRgV2y",
"value": 244246993
}
],
"entries": [
{
"account": "2NCGUnwpNgaJbhMZKLJcBrWvZhWnai5PjVC",
"value": -355450458
},
{
"account": "2NFJnLrhsCDfG3ooQvGC169gnzBabtRgV2y",
"value": 244246993
},
{
"account": "2NBXPR5PRtW8xBRuDnWXBDXqHYpDPupWnhG",
"value": 111200000
}
],
"confirmations": 77,
"pending": false,
"instant": false,
"blockhash": "0000000000509dbc80cc3d86cdb10ce8e87ab7867c6775a9b00ca904fbe70da7",
"height": 872145
}
]// end console.log(TXarray2);
How can we check if TXarray2.id which is the transactions id, if it matches a payment made by the user inside DBarray1.User_Profile.TXHash for examplecf948340a40d3302303dfb3710cfce37bb1cd156dcb6c74561fdc71c0a8fc30b .
I want to know forEach TXarray2.id who made the payment . I tried to do this with promises and i will share some code when i get home but i'm sure it can be done with async for all users one by one and log who made a payment today to this wallet. I tried with array.find() method to check inside TXHash but failed, i don't fully grasp many prototype methods yet...
Hopefully someone already thinks this a walk on the park for him and found a better solution to validate this kind of stuff. I will accept any answer even with lodash, maping, anything. TY !!!
You iterate TXArray2 and do a lookup in DBarray1 for the transactionId.
I like to work with native array methods like map and filter, so I would use something like the following:
const result = TXarray2.map(tx => ({
transaction: tx,
user: DBarray1.filter(user => user.User_Profile.TXHash.indexOf(tx.id) > -1)[0]
}));
In this example result is an array where every element contains a transaction and the matching user.
If you already have all of the transaction and user data, could you do something like this?
// for each transaction in TXarray2
for (let { 'id': transactionId } of TXarray2) {
// check each entry in DBarray1
for (let { '_id': userId, 'User_Profile': { 'TXHash': transactions } } of DBarray1) {
if (transactions.includes(transactionId)) {
console.log(`${transactionId} was made by ${userId}`);
}
}
}
The best way here is to use Array.indexOf (or Array.findIndex if you want to use callbacks) which returns -1 if an entry is not in an array.
Here's the sync variant:
var paid = [];
TXArray2.forEach(function(transaction){
for(var i = 0; i < DBArray1.length; ++i){
if(DBArray1[i].User_Profile.TXHash.indexOf(transaction.id) > -1){
paid.push({
user : DBArray1[i],
transaction : transaction
});
break;
}
}
});
console.log(paid);

Issue with converting JS object to array

Here is the one which i am trying to achieve.
I have the below JSON response. I am using $.getJSON method to loads JSON data and adding it in the collection by checking whether it is array as below.
{
"r": [{
"IsDefault": false,
"re": {
"Name": "Depo"
},
"Valid": "Oct8, 2013",
"Clg": [{
"Name": "james",
"Rate": 0.05
}, {
"Name": "Jack",
"Rate": 0.55
}, {
"Name": "Mcd",
"Rate": 0.01,
}],
},
{
"IsDefault": false,
"re": {
"Name": "Depo"
},
"Valid": "Oct8, 2013",
"Clg": [{
"Name": "james",
"Rate": 0.05
}, {
"Name": "Jack",
"Rate": 0.55
}, {
"Name": "Mcd",
"Rate": 0.01,
}],
},
{
"IsDefault": false,
"re": {
"Name": "Depo"
},
"Valid": "Oct8, 2013",
"Clg": [{
"Name": "james",
"Rate": 0.05
}, {
"Name": "Jack",
"Rate": 0.55
}, {
"Name": "Mcd",
"Rate": 0.01,
}],
}]
}
I am passing the json responses on both loadFromJson1 and loadFromJson2 function as parameter as below.
var tablesResult = loadFromJson1(resultstest.r[0].Clg);
loadFromJson1 = function (input) {
if (_.isArray(input)) {
alert("loadFromJson1: Inside array function");
var collection = new CompeCollection();
_.each(input, function (modelData) {
collection.add(loadFromJson1(modelData));
});
return collection;
}
return new CompeModel({
compeRates: loadFromJson2(input),
compName: input.Name
});
};
loadFromJson2 = function (input)
// here is the problem, the 'input' is not an array object so it is not going to IF condition of the isArray method. Hence i am trying to convert into array object.
{
if (_.isArray(input)) {
alert("loadFromJson2: Inside array function");
//alert is not coming here though it is array
var rcollect = new rateCollection();
_.each(input, function (modelData) {
rcollect.add(modelData);
});
return rcollect;
}
};
The above code i am passing json responeses for both loadFromJson1 and loadFromJson2 function as "input". isArray is getting true on only loadFromJson1 function and giving alert inside the if condition but not coming in loadFromJson2 function though i am passing the same parameter.
can you please tell me what mistakes i am doing here?
Your code is a bit scattered and the function loadFromJson1 is duplicted. Also some objects are not posted in de question.
I did however created a fiddle which work; "Inside array function" is printed...
simpliefied version of loadFromJson1 which is working in the fiddle:
loadFromJson1 = function (input) {
var resArray = $.map(input, function (value, index) {
return [value];
});
if (_.isArray(resArray)) {
console.log("Inside array function");
}
};

Categories