对JSON对象进行排序'儿童钥匙通过他们的儿童钥匙'值

时间:2014-06-10 11:34:57

标签: javascript json parsing sorting

我正在寻找一种方法来对我的三个主要JSON密钥(neutralpositivenegative)进行排序,使用他们的孩子y - 密钥'值。

这是JSON对象的设置方式:

{
  "chartSeries" : {
    "negative" : [ {
          "y" : 1505,
          "url" : "http://www.test.com/1"
        }, {
          "y" : 425,
          "url" : "http://www.test.com/2"
        }, {
          "y" : 1046,
          "url" : "http://www.test.com/3"
    } ],
    "neutral" : [ {
          "y" : 10,
          "url" : "http://www.test.com/4"
        }, {
          "y" : 1,
          "url" : "http://www.test.com/5"
        }, {
          "y" : 2,
          "url" : "http://www.test.com/6"
    } ],
    "positive" : [ {
          "y" : 230,
          "url" : "http://www.test.com/7"
        }, {
          "y" : 50,
          "url" : "http://www.test.com/8"
        }, {
          "y" : 483,
          "url" : "http://www.test.com/9"
    } ]
  }
}

假设我想按negative的值降序y值,那么我的JSON应如下所示:

{
  "chartSeries" : {
    "negative" : [ {
          "y" : 1505,
          "url" : "http://www.test.com/1"
        }, {
          "y" : 1046,
          "url" : "http://www.test.com/3"
        }, {
          "y" : 425,
          "url" : "http://www.test.com/2"
    } ],
    "neutral" : [ {
          "y" : 10,
          "url" : "http://www.test.com/4"
        }, {
          "y" : 2,
          "url" : "http://www.test.com/6"
        }, {
          "y" : 1,
          "url" : "http://www.test.com/5"
    } ],
    "positive" : [ {
          "y" : 230,
          "url" : "http://www.test.com/7"
        }, {
          "y" : 483,
          "url" : "http://www.test.com/9"
        }, {
          "y" : 50,
          "url" : "http://www.test.com/8"
    } ]
  }
}

注意负面元素如何按其降序y值和中性点排序'和积极的'值按照相同的顺序排序。

我尝试使用JSON.parse()将其解析为Javascript对象,然后使用排序函数:

function sortResults(data, prop, asc) {
    sorted_data = data.sort(function(a, b) {
        if (asc) return (a[prop] > b[prop]);
        else return (b[prop] > a[prop]);
    });
    return sorted_data;
}

但我得到" TypeError:data.sort不是一个函数"在我的调试器中。

非常感谢任何解释或建议!

2 个答案:

答案 0 :(得分:1)

不要忘记添加一个paseInt()以确保所有键都是整数。在那些日子里,我有很多有趣的时间搞清楚。

答案 1 :(得分:0)

我会坚持使用JSON.sortify(https://www.npmjs.com/package/json.sortify),因为它完全符合我的需要。

这个神奇功能背后的代码:

function sortKeys(o) {
    if (Array.isArray(o)) {
        return o.map(sortKeys)
    } else if (o instanceof Object) {
        var _ret = function() {
            var numeric = [];
            var nonNumeric = [];
            Object.keys(o).forEach(function(key) {
                if (/^(0|[1-9][0-9]*)$/.test(key)) {
                    numeric.push(+key)
                } else {
                    nonNumeric.push(key)
                }
            });
            return {
                v: numeric.sort(function(a, b) {
                    return a - b
                }).concat(nonNumeric.sort()).reduce(function(result, key) {
                    result[key] = sortKeys(o[key]);
                    return result
                }, {})
            }
        }();
        if (typeof _ret === "object") return _ret.v
    }
    return o
};

就是这样。