【问题标题】:Sort object having key value pair based on values根据值对具有键值对的对象进行排序
【发布时间】:2017-10-17 01:21:51
【问题描述】:

我已经声明了一个对象。

var obj = { “1”:“谷歌”, “2”:“雅虎”, "3": "msn", “4”:“堆栈溢出”, "5": "github", “6”:“jsfiddle”, “7”:“亚马逊”, “8”:“易趣” };

我需要根据值进行排序,然后将其推送到一个数组中,我需要显示该数组。 我已经根据值对对象进行了排序并推送到数组中。但是在显示数组时,值是根据键排序的。 我发现了它发生的原因,即因为键是数字,在推送到数组或对象时,值默认根据键排序。我不想更改键中存在的值。请让我知道是否有任何替代方法可以克服这个问题?

提前致谢, 钱丹

【问题讨论】:

  • 不清楚你的意思?按字母排序?另外你是如何添加到数组中的?
  • 当你可以使用数组时,你为什么要使用对象?
  • 例如:输入:{"10":"India", "12": "Australia","17":"China"}。输出: {"12": "Australia", "17":"China","10":"India"} 数组或对象什么都可以。但是数据应该根据值排序
  • @Pogrindis :我需要根据值对对象或数组进行排序,但键应该是数字。
  • 请添加一个想要的数组。对象的键实际上是无法排序的。

标签: javascript jquery arrays sorting javascript-objects


【解决方案1】:

好吧,谈到排序,我想指出的是,您实际上只能对 JS 中的数组进行排序。我的意思是你也可以“排序”一个对象,但在这种情况下,当你稍后遍历对象时,顺序并不能保证。

另一方面,在对数组进行排序时,保留键没有意义,因为如果这样做,值的最终顺序将基于键,因此按值排序变得毫无意义。

我会更改输入的格式并对对象数组进行排序——这将允许您保留键(和其他属性,如果需要)并根据值建立顺序。因此,假设您的输入是

var arr = [{id: "10", country:"India"}, {id:"12", country:"Australia"}, {id:"17", country:"China"}];

for(var i = 1; i < arr.length; i++) {
  var temp = arr[i]; 
  for(var j = i - 1; j >= 0 && temp['country'] < arr[j]['country']; j--) arr[j + 1] = arr[j];
  arr[j + 1] = temp;
}

// or just use the default JS function:
/*arr.sort(function(a, b) {
    return a.country > b.country;
});
*/

console.log(arr);

为了说明我在开头所说的:这将根据需要对对象进行排序,但不会保留最终顺序:

var obj = {"10":"India", "12": "Australia","17":"China"}, sorted = {}; // or []
var arr = []; // array of countries

// sorting countries
for(var key in obj) arr.push(obj[key]);
arr.sort();

// creating a data structure "sorted" in a "sorted" order
for(var i = 0; i < arr.length; i++) {
  for(var key in obj) if(obj[key] == arr[i]) { 
      console.log(arr[i]);  // seems it kind of writes it in the right order - Aus, Chi, Ind...
      sorted[key] = arr[i]; }
}
console.log(sorted); // ...but outputs differently (I use Chrome)

【讨论】:

  • 我有同样的问题,我可以按键对对象进行排序,但最终输出不一样 :( 。这里是使用 lodash _(inputObject).toPairs().sortBy(0).fromPairs().value(); 的简单排序
【解决方案2】:

使用它转换为数组

var arr =  $.map(obj, function(el) { return el });

比你只需要根据要求排序

【讨论】:

  • 不知道超大对象(10k 行的顺序)的性能,但这对我有帮助
【解决方案3】:
Object.keys(obj).reduce((arr,key)=>(arr[key]=obj[key],arr),[]);

简单地创建一个稀疏数组?

创建这个:

[undefined, "google", "yahoo", "msn", "stackoverflow", "github", "jsfiddle", "amazon", "ebay"]

或者你只是用它做一个数组,做:

Object.setPrototypeOf(obj,Array.prototype);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 2010-11-16
    • 1970-01-01
    • 2013-11-25
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多