【问题标题】:Sorting complex json排序复杂的json
【发布时间】:2020-04-20 23:24:06
【问题描述】:

朋友们,我在 javascript 中有以下对象:

{
    id:     {0: 3,      1: 2,       2: 1}
    amount: {0: 1000,   1: 5000,    2: 300},
    date:   {0: "aaa",  1: "bbb",   2: "ccc"}
}

如何按“金额”键降序排序? “id”和“date”对象必须根据排序的数量重新排列

预期结果是:

{
    id:     {0: 2,      1: 3,       2: 1}
    amount: {0: 5000,   1: 1000,    2: 300},
    date:   {0: "bbb",  1: "aaa",   2: "ccc"}
}

【问题讨论】:

  • 请在您的尝试中发布一个片段。

标签: javascript arrays json sorting


【解决方案1】:

amount 的键按amount 排序,并使用这些排序键的顺序以新顺序重新创建对象:

const x = {
    id:     {0: 3,      1: 2,       2: 1}, 
    amount: {0: 1000,   1: 5000,    2: 300},
    date:   {0: "aaa",  1: "bbb",   2: "ccc"}, 
};

const newX = Object.keys(x.amount)
  .sort((a, b) => x.amount[b] - x.amount[a])
  .reduce((a, c, i) => ({
    id: { ...a.id, [i]: x.id[c] },
    amount: { ...a.amount, [i]: x.amount[c] },
    date: { ...a.date, [i]: x.date[c] },
 }), { id: {}, amount: {}, date: {} }) ;

console.log(newX);

【讨论】:

  • 谢谢!它工作得很好。尝试对这个对象进行排序已经有好几天了——我同意使用它很难看,但这是我从前端得到的。非常干净的解决方案。
  • @CarlosAlzate 干净吗?也许。简洁的?当然。可读/可维护?不是真的。
【解决方案2】:

我首先建议您更改数据布局。它不是一种排序友好的格式。我会推荐以下内容:

[
    {id: 2, amount: 5000, date: "bbb"},
    {id: 3, amount: 1000, date: "aaa"},
    {id: 1, amount: 300, date: "ccc"},
]

完成后,您可以使用 sortBy 方法对子键上的数组进行排序,例如:https://caolan.github.io/async/v3/sortBy.js.html

例如:

sortBy(obj2, (row) => row.amount, (result) => {
    console.log(result);
})

【讨论】:

    【解决方案3】:

    说实话,这种格式的数据很难处理。我的建议是,如果有任何方法可以改变结构,那将是非常可取的。但是,如果不是这种情况,您可以将数据处理为可行的格式,对其进行排序,然后将其处理回原始格式,如下所示:

    let data = {
        id:     {0: 3,      1: 2,       2: 1},
        amount: {0: 1000,   1: 5000,    2: 300},
        date:   {0: "aaa",  1: "bbb",   2: "ccc"}
    }
    
    // group data by index i.e. id[0], amount[0], and date[0] should be grouped together
    let grouped = Object.entries(data.id).reduce((res, curr) => {
      let [key, value] = curr;
      res.push([data.id[key], data.amount[key], data.date[key]]);
      return res;
    }, []);
    
    
    // sort by index 1 (amount) descending
    let sorted = grouped.sort((a,b) => {
      return b[1] - a[1];
    });
    
    // take sorted data and put back into original structure
    let final = sorted.reduce((res, curr, index) => {
      let [id, amount, date] = curr;
      res.id[index] = id;
      res.amount[index] = amount;
      res.date[index] = date;
      return res;
    }, {id: {}, amount: {}, date: {}});
    
    console.log(final);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多