How to build an array from jSon object

Hi guys, I'm trying to build 2 arrays from JSON arrays.

{ "2015-03-24": { "bind": 0, "info": "", "notes": "", "price": "150", "promo": "", "status": "available" }, "2015-03-25": { "bind": 0, "info": "", "notes": "", "price": "150", "promo": "", "status": "available" }, "2015-03-26": { "bind": 0, "info": "", "notes": "", "price": "150", "promo": "", "status": "available" }, "2015-03-27": { "bind": 0, "info": "", "notes": "", "price": "100", "promo": "", "status": "available" }, "2015-03-28": { "bind": 0, "info": "", "notes": "", "price": "100", "promo": "", "status": "available" }, "2015-03-29": { "bind": 0, "info": "", "notes": "", "price": "100", "promo": "", "status": "available" }, "2015-04-10": { "bind": 0, "info": "", "notes": "", "price": "", "promo": "", "status": "booked" }, "2015-04-11": { "bind": 0, "info": "", "notes": "", "price": "", "promo": "", "status": "booked" }, "2015-05-01": { "bind": 0, "info": "", "notes": "", "price": "", "promo": "", "status": "unavailable" }, "2015-05-02": { "bind": 0, "info": "", "notes": "", "price": "", "promo": "", "status": "unavailable" }, "2015-05-03": { "bind": 0, "info": "", "notes": "", "price": "", "promo": "", "status": "unavailable" }, } 

This is a jSon array,

So, I want to build 2 arrays.

1 array containing only the keys (in this case the date) of those elements where status=='booked' nOR status=='unavailable' , and builds it in a jQuery array like this

 var array = ['2015-03-19', '2015-03-20', '2015-03-21', '2015-03-22', '2015-03-23', '2015-03-24', '2015-03-25', '2015-03-26', '2015-04-07', '2015-04-08', '2015-04-09', '2015-04-10']; 

Another creates another array with the dates of those days when status=='available' AND price > '100$'

var array2 = ['2015-03-25', '2015-03-26', '2015-04-07', '2015-04-08'];

How can I achieve this with jQuery ??

+6
source share
4 answers

If j is your json:

 var a1 = []; var a2 = []; $.each( j, function( key, ob ) { if(ob.price > 100 && ob.status == 'available'){ a1.push(key); } if(ob.status == 'booked' || ob.status == 'unavailable'){ a2.push(key); } }); console.log(a1); console.log(a2); 

Productivity:

 ["2015-03-24", "2015-03-25", "2015-03-26"] ["2015-04-10", "2015-04-11", "2015-05-01", "2015-05-02", "2015-05-03"] 
+4
source

You may have a more general approach, which may be useful for adaptation in other scenarios, without jQuery dependencies. Small data filtering function:

 function from(data) { var predicates = []; var results = []; function exec() { for (var k in data) { if (data.hasOwnProperty(k)) { for (var i = 0, l = predicates.length; i < l; i++) { if (predicates[i](data[k])) { results[i][k] = data[k] } } } } return results; } exec.get = function(predicate) { predicates.push(predicate); results.push({}); return exec; } return exec; } 

By providing this, you can write code, for example:

 // predicates function isNotAvailable(item) { return item.status === "unavailable" || item.status === "booked" } function isAvailableAndPriceGreater100(item) { return item.status === "available" && +item.price > 100 } // results var results = from(obj) .get(isNotAvailable) .get(isAvailableAndPriceGreater100) (); 

Where obj is your object with all the data.

This command will return two arrays, one for each specific predicate, with the whole object - because it can be useful if you want to access some properties, o filter again. If you want only keys, at this point you can simply do:

 var notAvailableDates = Object.keys(results[0]); 
+1
source

Try it,

 var array1 = []; var array2 = []; $.each(data.items, function(key, val) { if((val.status == 'booked') || (val.status == 'unavailable')){ array1.push(key); } if((val.status == 'available') && (val.price > 100)){ array2.push(key); } }) 
0
source
 function obj_key_select(obj, func) { newArr = []; for(var index in obj) { if (obj.hasOwnProperty(index)) { if(func(obj[index])) { newArr.push(index); } } } return newArr; } var dates = JSON.parse(jsonString); var arrOne = obj_key_select(dates, function(element){ return (element.status === 'booked' || element.status === 'unavailable'); }); var arrTwo = obj_key_select(dates, function(element){ return (element.status === 'available' && parseInt(element.price) > 100); }); 
0
source

Source: https://habr.com/ru/post/984009/


All Articles