Vyhledávání na webu

javascript - Jak vytvořit pole z jSon objektu


Snažím se vytvořit 2 pole z JSON polí.

{
    "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"
    },


}

Toto je jSon pole, takže chci vytvořit 2 pole.

1 pole obsahující pouze klíče (v tomto případě datum) těch prvků, kde status=='booked' nEBO status=='unavailable' a vytvořit ho v jQuery poli takto

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'];

Další vytváří další pole s daty těch dnů, kdy status=='available' AND price > '100$'

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

Jak toho mohu dosáhnout pomocí jQuery?

Odpověď č. 1

Pokud je j váš 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);

Výnosy :

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

Odpověď č. 2

Můžete mít více obecný přístup, který by mohl být užitečný pro přizpůsobení v jiných vašich scénářích, bez závislosti na jQuery. Malá funkce pro filtrování dat:

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

Díky tomu nyní můžete psát kód jako:

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

Kde obj je váš objekt se všemi daty.

Tento příkaz vrátí dvě pole, jedno pro každý definovaný predikát, se všemi objekty - protože to může být užitečné, pokud chcete přistupovat k některým vlastnostem, nebo znovu filtrovat. Pokud chcete jen klíče, můžete v tu chvíli jednoduše udělat:

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