如何在javascript中将键值对对象数组转换为关联数组

如何在javascript中将键值对对象数组转换为关联数组,javascript,arrays,json,javascript-objects,Javascript,Arrays,Json,Javascript Objects,你们从来没有让我失望过,我在这个问题上有点紧张,我需要在将java映射转换为JSON对象时保持其顺序,我意识到这几乎是不可能的,于是决定使用JSON数组。但是,这对我的特定数据有效的唯一方法是使用JSON对象的JSON数组。看起来是这样的: [{"2014-11-18":0},{"2014-11-19":0},{"2014-11-20":0},{"2014-11-21":0},{"2014-11-22":0},{"2014-11-23":0},{"2014-11-24":0}] 让我来到这里的

你们从来没有让我失望过,我在这个问题上有点紧张,我需要在将java映射转换为JSON对象时保持其顺序,我意识到这几乎是不可能的,于是决定使用JSON数组。但是,这对我的特定数据有效的唯一方法是使用JSON对象的JSON数组。看起来是这样的:

[{"2014-11-18":0},{"2014-11-19":0},{"2014-11-20":0},{"2014-11-21":0},{"2014-11-22":0},{"2014-11-23":0},{"2014-11-24":0}]
让我来到这里的代码:

public static JSONArray dataGenerationDay(ArrayList<String> comp, int days) {
    DateTimeFormatter formatter = DateTimeFormat.forPattern("MM-dd-yyyy");
    Map<LocalDate, Integer> compMap = new TreeMap<LocalDate, Integer>();
    JSONArray orderedJSON = new JSONArray();

    //create map of data with date and count
    for (String date : comp) {
        DateTime dt = formatter.parseDateTime(date);
        LocalDate dateTime = new LocalDate(dt);
        if (!compMap.containsKey(dateTime)) {
            compMap.put(dateTime, 1);
        } else {
            int count = compMap.get(dateTime) + 1;
            compMap.put(dateTime, count);
        }
    }


    //if there were days missing in the DB create those days and put them in the map
    //with a zero count
    if (compMap.size() < days){
        LocalDate today = LocalDate.now();
        for (int i = 0; i < days; i++){
            LocalDate dayCount = today.minusDays(days- i);
            if (!compMap.containsKey(dayCount)) {
                compMap.put(dayCount, 0);
            }

        }
    }   

    //json object does not hold order of tree map, create json array
    //of ?json objects? to maintain order for the graph
    for (Map.Entry<LocalDate,Integer> entry : compMap.entrySet()){
        JSONObject object = new JSONObject();
        object.put("" + entry.getKey(), entry.getValue());
        orderedJSON.put(object);
        //test the order of the map for validity
        System.out.println("Key Value Pair Is: " + entry.getKey() + " : " + entry.getValue());
    }
    //test the order of the array for validity
    System.out.println("Ordered JSON List: " + orderedJSON.toString());
    return orderedJSON;
}
有什么想法吗?

试试这个

var dateToArray = function(json_object) {

    var dayArray = [],
        key;

    for (var i = 0; i < json_object.length; i++) {
        key = Object.keys(json_object[i])[0];

        dayArray.push({
            "Date" : key,
            "Count" : json_object[i][key]
        });
    }

    return dayArray;
};
json_对象是数组而不是对象,您不应该在..中使用。。语句对对象的可枚举属性进行迭代。在我的示例中,我使用返回对象中键的数组,您可以通过对象中的键获取值,因为在JS中,从对象获取属性有两种方式,如obj.key或obj[key]


演示:

我想这就是你想要的:。JS没有关联数组,它有是的这是我想要的,我道歉。我的问题是,我试图从对象数组中提取值并将其放入新对象的方式不起作用?@FelixKling在a中,JS起作用,它们只是不被称为关联数组。@ajp15243:Mmmh,是的。对我来说,术语数组也意味着一种顺序,就像它在PHP中工作一样。但是,对象的属性不是有序的。但我想关联数组实际上只是一个字典,在这种情况下我同意。@RichardDavy:我想你不想做我链接到的事情。看起来您只是在for…in循环中遇到了问题。查看文档以了解其工作原理:
var dateToArray = function(json_object) {

    var dayArray = [],
        key;

    for (var i = 0; i < json_object.length; i++) {
        key = Object.keys(json_object[i])[0];

        dayArray.push({
            "Date" : key,
            "Count" : json_object[i][key]
        });
    }

    return dayArray;
};