【问题标题】:Sort Javascript array of objects in place by property value with save keys使用保存键按属性值对 Javascript 对象数组进行排序
【发布时间】:2018-02-28 18:36:15
【问题描述】:

如何通过持有字符串键的属性“成本”对对象数组进行排序?

开始数组:

aparts: {
    apart1 : {id: "1", status: 2, cost: 10033450},
    apart2 : {id: "2", status: 2, cost: 5214000},
    apart3 : {id: "3", status: 2, cost: 7314300},
    apart4 : {id: "4", status: 1, cost: 9261700}    
}

想要数组:

aparts: {
    apart2 : {id: "2", status: 2, cost: 5214000},
    apart3 : {id: "3", status: 2, cost: 7314300},
    apart4 : {id: "4", status: 1, cost: 9261700},
    apart1 : {id: "1", status: 2, cost: 10033450}   
}

【问题讨论】:

  • 不能正式对对象属性(键)进行排序
  • apartsNOT 数组。这是一个普通的对象。
  • @DuncanThacker - 你真的看过想要的结果了吗?
  • 排序是一项“仅限数组”的工作...您最好将对象放入数组中,然后愉快地对它们进行排序。
  • 正如@Redu 所说的排序是针对数组的,这可以通过反射和迭代键来解决,将它们放在数组上,对数组进行排序并重建对象。但我不明白为什么需要

标签: javascript arrays sorting properties


【解决方案1】:

不保证属性的顺序。例如,请参见:

https://stackoverflow.com/a/5525820/1250301

如果你想要一些有序的东西,那么你需要使用一个数组。转换非常简单:

var aparts = {
    apart1 : {id: "1", status: 2, cost: 10033450},
    apart2 : {id: "2", status: 2, cost: 5214000},
    apart3 : {id: "3", status: 2, cost: 7314300},
    apart4 : {id: "4", status: 1, cost: 9261700}    
};

var arr = Object.keys(aparts).map(function(k) { return aparts[k]; }).sort(function(a,b) { return a.cost - b.cost });

console.log(arr);

【讨论】:

    【解决方案2】:

    const aparts = {
        apart1: {id:"1", status: 2, cost: 10033450},
        apart2: {id:"2", status: 2, cost: 5214000},
        apart3: {id:"3", status: 2, cost: 7314300},
        apart4: {id:"4", status: 1, cost: 9261700}    
    };
    
    const arr = 
      Object.keys(aparts)
      .map(k => (aparts[k]))
      .sort((a,b) => (a.cost - b.cost))
      .map(k => ({["apart" + k.id]: k}))
    ;
    
    console.log(arr);

    【讨论】:

      【解决方案3】:

      我相信您正在寻找地图。这就是您的不规则对象匹配的内容。

      let aparts= {
          apart1: { id: "1", status: 2, cost: 10033450 },
          apart2: { id: "2", status: 2, cost: 5214000 },
          apart3: { id: "3", status: 2, cost: 7314300 },
          apart4: { id: "4", status: 1, cost: 9261700 }
      };
      let sorted = Object.entries(aparts).map(x => Object.assign(x[1], {
        apart: x[0]
      })).sort((a, b) => a.cost - b.cost);
      
      let result = new Map(sorted.map(x => ([x.apart, (delete x.apart, x)])));
      
      console.log(...result)

      【讨论】:

      • @dsb 我想留给你一个想法......但我不确定你有什么地方可以放它。
      • 不懂你
      猜你喜欢
      • 2019-12-03
      • 2011-09-06
      • 1970-01-01
      • 2021-07-20
      • 2017-05-31
      • 2014-08-25
      • 2010-11-02
      相关资源
      最近更新 更多