如何从一个JSON对象构建一个数组

6

我正在尝试从JSON数组中构建2个数组。

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


}

这是一个JSON数组,我想构建两个数组。
第一个数组仅包含那些元素的键(在本例中为日期),其中status == 'booked' nOR status == 'unavailable',并且将其构建为jQuery数组。
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'];

另一个问题是要建立另一个数组,其中包含那些日期的日期,状态为“available”且价格大于“100美元”。

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

如何使用jQuery实现这一点?


可能是重复的问题:将数组转换为JSON - arkoak
答案发生了什么事? - Johnny
@watcher 是我看错了还是之前这里有一个答案??? - Johnny
它被所有者删除了,我猜测是因为它是用PHP编写的,而不是JavaScript。 - Jeff Lambert
是的,我删掉了,因为我用 PHP 做了,真遗憾,如果还有时间,我必须尝试用 jQuery 来完成它... - n-dru
这与jQuery无关。 - Alnitak
4个回答

5
如果您的json是j
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);

产生:

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

1
你可以采用更通用的方法,这可能在其他情况下也很有用,而不需要依赖于jQuery。一个小型的数据过滤函数:
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;
}

鉴于此,您现在可以编写如下代码:

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

其中obj是包含所有数据的对象。

该命令将返回两个数组,每个数组对应定义的谓词,并包含所有对象——因为如果您想要访问某些属性或再次过滤,这可能很有用。如果您只想要键,则可以简单地执行以下操作:

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

0

试试这个,

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接