【问题标题】:sorting an object of an object in javascript在javascript中对对象的对象进行排序
【发布时间】:2018-03-18 18:44:49
【问题描述】:

我有一个对象

const posts = {
"BAhvZrRwcfu":{

    "text":"Totally need to try this.",
    "user": "heavymetaladam",
  vote: 2

},
"BAcyDyQwcXX":{

    "text":"Wes. WE should have lunch.",
    "user": "jdaveknox",
  vote : 3

 }
};

有没有一种方法可以根据投票进行排序。如果我将其设为对象数组似乎更容易

【问题讨论】:

  • 是的,有一些可以尝试的方法。您能否在问题中包含您尝试解决查询的代码?见stackoverflow.com/help/mcve
  • 不仅更简单,而且可以排序。
  • @linux 请参阅下面的答案。你用了钥匙。你想要价值观。
  • var keys = Object.keys(state.posts); keys.sort((a, b) => { if (a.voteScore < b.voteScore) { return -1; } if (a.voteScore > b.voteScore) { return 1; } // a.voteScore must be equal to b.voteScore return 0; }).reduce((a, v) => { return state.posts[v] }, {})
  • It seems easier if i make it an array of object - 是的,你在这一点上是对的,因为对象不是“可排序的”,数组是

标签: javascript json sorting


【解决方案1】:

我建议转换为对象数组。然后,您可以控制您的排序标准,并在将来这些标准发生变化时更轻松地进行更改。

你可以这样做:

var postsList = Object.values(posts)

有关其工作原理/原因的更多详细信息,请参阅此 Stackoverflow 答案:

如果您还不知道如何执行此操作,请参阅上一个关于堆栈溢出的答案以获取有关对对象数组进行排序的详细信息:

例如,按票数排序:

posts.sort(function(a, b) { return parseInt(a.vote) - parseFloat(b.vote); });

【讨论】:

  • 不要在数字上使用parseInt
  • 我终于找到了一种方法,我先转换为对象数组,然后排序,然后再转换回对象对象
【解决方案2】:

您可以使用 Object.entries() 从原始对象创建对象数组

const posts = {
  "BAhvZrRwcfu": {
    "text": "Totally need to try this.",
    "user": "heavymetaladam",
    "vote": 3
  },
  "BAcyDyQwcXX": {
    "text": "Wes. WE should have lunch.",
    "user": "jdaveknox",
    "vote": 2
  }
};

const sortedPosts = Object.entries(posts)
                    .sort(([, {vote: a}], [, {vote: b}]) => a < b ? -1 : 1)
                    .map(([key, prop]) => ({[key]: prop}));

console.log(sortedPosts);

或者,您可以在 Map 中设置对象

const posts = {
  "BAhvZrRwcfu": {
    "text": "Totally need to try this.",
    "user": "heavymetaladam",
    "vote": 3
  },
  "BAcyDyQwcXX": {
    "text": "Wes. WE should have lunch.",
    "user": "jdaveknox",
    "vote": 2
  }
};

const sortedPosts = new Map;

Object.entries(posts)
.sort(([, {vote: a}], [, {vote: b}]) => a < b ? -1 : 1)
.forEach(([key, prop]) => sortedPosts.set(key, prop));

console.log(sortedPosts);

【讨论】:

  • 这可行,但它返回一个对象数组,我需要一个对象的对象。我这样做是为了转换回对象的对象posts = {} for (let num in aa) { posts[aa[num].id] = aa[num] }
【解决方案3】:

对象本质上是基于键的而不是有序的。要按特定顺序访问它,我发现创建一个订单列表很有帮助:

var order = [];
$.each(posts, function(key, value) {
  order.push([key, value.vote])
});  //use for loop if you prefer
order.sort(function(a,b){
  return a[1] - b[1];  //ascending order
})

那么就可以根据数组order的顺序访问posts,例如

order.forEach(function(e){
  posts[e[0]];
})

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2019-01-08
    • 2011-05-12
    • 2013-07-15
    • 2021-08-19
    • 2023-03-23
    相关资源
    最近更新 更多