【问题标题】:Sort JSON response by key value按键值对 JSON 响应进行排序
【发布时间】:2018-07-05 17:13:46
【问题描述】:

在您将其标记为重复之前 - 我已经阅读了这些答案:

Sort JSON by array key value

Sort a JSON array object using Javascript by value

我已经尝试将代码移到我的数据中,但它不起作用。我也尝试将每个对象项推入一个数组,但这不起作用,因为每个项内部仍然有一个对象。

Here's a bit of the JSON response I get(浏览器控制台截图)

如您所见,每个项目都有一个索引 - 我需要的是根据索引对响应进行排序。我该怎么做呢?

此回复来自维基百科 - 顺便说一句。 Here's the full API call,如果有帮助的话。

编辑:在此处发布一些响应代码:

 "pages": {
      "736": {
        "pageid": 736,
        "ns": 0,
        "title": "Albert Einstein",
        "index": 2,
        "contentmodel": "wikitext",
        "pagelanguage": "en",
        "pagelanguagehtmlcode": "en",
        "pagelanguagedir": "ltr",
        "touched": "2018-01-24T22:40:11Z",
        "lastrevid": 821432412,
        "length": 145560,
        "fullurl": "https://en.wikipedia.org/wiki/Albert_Einstein",
        "editurl": "https://en.wikipedia.org/w/index.php?title=Albert_Einstein&action=edit",
        "canonicalurl": "https://en.wikipedia.org/wiki/Albert_Einstein",
        "thumbnail": {
          "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Einstein_1921_by_F_Schmutzer_-_restoration.jpg/38px-Einstein_1921_by_F_Schmutzer_-_restoration.jpg",
          "width": 38,
          "height": 50
        },
        "pageimage": "Einstein_1921_by_F_Schmutzer_-_restoration.jpg"
      },
      "983": {
        "pageid": 983,
        "ns": 0,
        "title": "Albert Camus",
        "index": 10,
        "contentmodel": "wikitext",
        "pagelanguage": "en",
        "pagelanguagehtmlcode": "en",
        "pagelanguagedir": "ltr",
        "touched": "2018-01-26T09:34:35Z",
        "lastrevid": 822358239,
        "length": 53639,
        "fullurl": "https://en.wikipedia.org/wiki/Albert_Camus",
        "editurl": "https://en.wikipedia.org/w/index.php?title=Albert_Camus&action=edit",
        "canonicalurl": "https://en.wikipedia.org/wiki/Albert_Camus",
        "thumbnail": {
          "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Albert_Camus%2C_gagnant_de_prix_Nobel%2C_portrait_en_buste%2C_pos%C3%A9_au_bureau%2C_faisant_face_%C3%A0_gauche%2C_cigarette_de_tabagisme.jpg/42px-Albert_Camus%2C_gagnant_de_prix_Nobel%2C_portrait_en_buste%2C_pos%C3%A9_au_bureau%2C_faisant_face_%C3%A0_gauche%2C_cigarette_de_tabagisme.jpg",
          "width": 42,
          "height": 50
        },
        "pageimage": "Albert_Camus,_gagnant_de_prix_Nobel,_portrait_en_buste,_posé_au_bureau,_faisant_face_à_gauche,_cigarette_de_tabagisme.jpg"
      },
      "46721": {
        "pageid": 46721,
        "ns": 0,
        "title": "Edward VII",
        "index": 9,
        "contentmodel": "wikitext",
        "pagelanguage": "en",
        "pagelanguagehtmlcode": "en",
        "pagelanguagedir": "ltr",
        "touched": "2018-01-26T02:00:27Z",
        "lastrevid": 821663314,
        "length": 81925,
        "fullurl": "https://en.wikipedia.org/wiki/Edward_VII",
        "editurl": "https://en.wikipedia.org/w/index.php?title=Edward_VII&action=edit",
        "canonicalurl": "https://en.wikipedia.org/wiki/Edward_VII",
        "thumbnail": {
          "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/44/Edward_VII_in_coronation_robes.jpg/35px-Edward_VII_in_coronation_robes.jpg",
          "width": 35,
          "height": 50
        },
        "pageimage": "Edward_VII_in_coronation_robes.jpg"
      }

【问题讨论】:

  • 您能以代码形式而不是图像发布您尝试排序的 JSON 对象吗?
  • 如果您想做一些如此具体的事情,以至于这里没有其他问题可以解决您的问题,您不应该告诉我们您想做什么以及为什么其他技术不适用吗?
  • 你想按什么排序哪个数组?
  • @devius 响应非常大,这就是为什么我没有在正文中发布 - 但我现在已经做到了:) @NinaScholz index。不幸的是,它不是一个数组,它是我得到的 JSON 响应,我想要一种方法来按对象中每个项目所具有的 index 对这个响应进行排序。
  • 那么,为什么你把这个标题放在 按键值排序 JSON 响应

标签: javascript arrays json sorting object


【解决方案1】:

您的回复似乎是一个无法排序的对象。您首先要将其转换为数组

const res = //... your response
const array = Object.keys(res).map(key => res[key]);

现在您可以使用Array.sort 函数按照index 对您的项目进行排序:

array.sort((itemA, itemB) =>  itemA - itemB)

请注意,排序函数会直接改变数组。

见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

【讨论】:

  • 我希望我能理解为什么您的代码有效,而我之前尝试过的代码却没有。为了推入一个数组,我尝试了:` let arr = []; for (let key in obj){ arr.push([key, obj[key]]); }` 然后尝试了相同的排序方法,但我一直遇到错误。
  • 错误是什么?在您的情况下,您将数组推入数组中。在我的示例中,您会将对象推送到数组中。
  • 我的解决方案基本上是:for(let key in obj) { arr.push(obj[key])}。虽然for..in 使用起来有点不安全,但请参阅:stackoverflow.com/questions/500504/…
【解决方案2】:

这是我的方法,只需转换为数组,然后取回 JSON 对象。

更新: 我所做的是创建一个包含每个 page 的数组,然后使用数组的 Array.prototype.sort() 函数我比较了每个 page 的索引,然后使用我重新创建的 for-loop使用排序数组中的对象的 JSON 对象。

var json = {
  "pages": {
    "983": {
      "pageid": 983,
      "ns": 0,
      "title": "Albert Camus",
      "index": 10,
      "contentmodel": "wikitext",
      "pagelanguage": "en",
      "pagelanguagehtmlcode": "en",
      "pagelanguagedir": "ltr",
      "touched": "2018-01-26T09:34:35Z",
      "lastrevid": 822358239,
      "length": 53639,
      "fullurl": "https://en.wikipedia.org/wiki/Albert_Camus",
      "editurl": "https://en.wikipedia.org/w/index.php?title=Albert_Camus&action=edit",
      "canonicalurl": "https://en.wikipedia.org/wiki/Albert_Camus",
      "thumbnail": {
        "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Albert_Camus%2C_gagnant_de_prix_Nobel%2C_portrait_en_buste%2C_pos%C3%A9_au_bureau%2C_faisant_face_%C3%A0_gauche%2C_cigarette_de_tabagisme.jpg/42px-Albert_Camus%2C_gagnant_de_prix_Nobel%2C_portrait_en_buste%2C_pos%C3%A9_au_bureau%2C_faisant_face_%C3%A0_gauche%2C_cigarette_de_tabagisme.jpg",
        "width": 42,
        "height": 50
      },
      "pageimage": "Albert_Camus,_gagnant_de_prix_Nobel,_portrait_en_buste,_posé_au_bureau,_faisant_face_à_gauche,_cigarette_de_tabagisme.jpg"
    },
    "736": {
      "pageid": 736,
      "ns": 0,
      "title": "Albert Einstein",
      "index": 2,
      "contentmodel": "wikitext",
      "pagelanguage": "en",
      "pagelanguagehtmlcode": "en",
      "pagelanguagedir": "ltr",
      "touched": "2018-01-24T22:40:11Z",
      "lastrevid": 821432412,
      "length": 145560,
      "fullurl": "https://en.wikipedia.org/wiki/Albert_Einstein",
      "editurl": "https://en.wikipedia.org/w/index.php?title=Albert_Einstein&action=edit",
      "canonicalurl": "https://en.wikipedia.org/wiki/Albert_Einstein",
      "thumbnail": {
        "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Einstein_1921_by_F_Schmutzer_-_restoration.jpg/38px-Einstein_1921_by_F_Schmutzer_-_restoration.jpg",
        "width": 38,
        "height": 50
      },
      "pageimage": "Einstein_1921_by_F_Schmutzer_-_restoration.jpg"
    }
  }
};

var array = [];
for (key in json.pages) {
  array.push(json.pages[key]);
}

array.sort(function(a, b) {
  return a.index - b.index;
});

json = {
  "pages": {}
};

for (var i = 0; i < array.length; i++) {
  json.pages[array[i]['pageid']] = array[i];
}

console.log(json);

希望对您有所帮助!

【讨论】:

  • 感谢您抽出宝贵时间回复!只是一个简单的问题:完美运行!只是希望我能理解它为什么起作用。
【解决方案3】:

我创建了这些函数来订购一个 json,这样如果里面有另一个 json,它也可以工作。

function orderJson(json) {
    let ordered = this.jsonToSortedArray(json);
    let result = this.arrayToStringJson(ordered);
    return JSON.parse(result);
}

function jsonToSortedArray(json) {
    let ordered = [];
    for (let i in json) {
        let value;
        if (json[i] instanceof Object) {
            value = jsonToSortedArray(json[i]);
        } else {
            value = json[i];
        }
        ordered.push([i, value]);
    }
    return ordered.sort();
}

function arrayToStringJson(ordered) {
    let result = '{'
    for (let i = 0; i < ordered.length; i++) {
        const key = '"' + ordered[i][0] + '"';
        let value;
        if (ordered[i][1] instanceof Array) {
            value = ':' + this.arrayToStringJson(ordered[i][1]) + ',';
        } else {
            value = ':"' + ordered[i][1] + '",';
        }
        result += key + value;
    }
    result = result.substring(0, result.length - 1);
    return result + '}';
}

如果您希望将 json 作为字符串,请不要使用函数 JSON.parse

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 2012-11-06
    • 1970-01-01
    • 2010-10-27
    • 2021-04-03
    • 2019-06-06
    • 2019-01-02
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多