【问题标题】:Sorting JSON objects by string value to Javascript array按字符串值将 JSON 对象排序到 Javascript 数组
【发布时间】:2017-02-28 19:45:09
【问题描述】:

我有一个 React.js 应用程序,它从后端接收 JSON 数据。

我不确定如何通过字符串而不是数字的键对对象进行排序 - 如果是后者,我可以使用大量示例。

这是一个示例字符串。我要排序的对象是HighMediumLow。我想先高位排序,然后是中位,然后是低位。

{"Medium":{"This is inbetween!":[{"key":"123", "type":"inbetween"}]},
"High":{"This is the highest!":[{"key":"3333", "type":"highest"}]},
"Medium":{"This is inbetween again":[{"key":"12333123", "type":"power"}]},
"Low":{"This is the lowest!":[{"key":"123465", "type":"super low"}]}}

如何将这些 JSON 数据排序为数组中的高、中、低字符串?

【问题讨论】:

  • 为什么不更新问题以显示您希望结果数组的样子?输入对象不是数组,无法排序。
  • 嗯,它可以被排序到一个数组中......无论如何,给定对象输入只有一个“中”项。
  • 如果您希望结果为数组,您当然可以这样做(请参阅 Pointy 的评论)。你试过什么?你被困在哪里了?你的研究结果是什么?
  • JSON 既无效(至少缺少逗号,可能更多),而且可能不是您想要的(奇怪的嵌套)。
  • @T.J.Crowder 试图以我的输入数据为例,可能在某处打错了。

标签: javascript arrays json sorting reactjs


【解决方案1】:

因此,由于您的“对象”很可能是一个数组(这将是一个无效对象,具有重复的声明,例如 Medium 属性),我假设您的数据如下所示......

您可以通过创建另一个“订单”对象来对对象数组进行排序,并为键分配一个订单号。

我认为下面的 sn-p 会做你想做的事:

let arr = [
    {
        "Medium": {
            "This is inbetween!": [
                {
                    "key": "123",
                    "type": "inbetween"
                }
            ]
        }
    },
    {
        "High": {
            "This is the highest!": [
                {
                    "key": "3333",
                    "type": "highest"
                }
            ]
        }
    },
    {
        "Medium": {
            "This is inbetween again": [
                {
                    "key": "12333123",
                    "type": "power"
                }
            ]
        }
    },
    {
        "Low": {
            "This is the lowest!": [
                {
                    "key": "123465",
                    "type": "super low"
                }
            ]
        }
    }
];

let order = {
    High: -3,
    Medium: -2,
    Low: -1
}


arr = arr.sort((a,b) => {
    return order[Object.keys(a)[0]] - order[Object.keys(b)[0]];
});

console.log(arr);

【讨论】:

  • 我在一些示例数据上尝试了您的示例(其中有许多高和中数据),并且我只有一个 len 3 的数组,其中内容只是中等数据。不过谢谢你的例子,我会解决的!
  • 虽然这是一个好主意(在这种情况下是dupe),但我建议在订单对象中使用非零值,因为这不会为处理未知值和不会像(可能)想要开始或结束数组那样移动。
  • 使用您的方法,我将如何访问键为“高”的所有对象? console.log(Arr[].High) 似乎不起作用,听起来也不对(我有点累:))
  • 您需要过滤数组。要获得所有高的条目,这应该有效:console.log(arr.filter(v => Object.keys(v)[0] === 'High'));@cbll
猜你喜欢
  • 2014-07-10
  • 2019-11-24
  • 2019-08-02
  • 2018-11-20
  • 2021-06-27
相关资源
最近更新 更多