【问题标题】:Sorting array of object based on range of Numbers of String [closed]根据字符串的数量范围对对象数组进行排序[关闭]
【发布时间】:2018-08-27 06:32:00
【问题描述】:

我有一个对象数组,比如

let myObj =[{
              "60+": 0.1413972485314015,
              "18-29": 0.0832178903621611,
              "40-49": 0.1033361204013377,
              "30-39": 0.0835906328864075,
              "Under 18": 0.1326368677036551,
              "50-59": 0.1224973366151133
           }]

我想对上面的对象数组进行排序

let myObj =[{
             "Under 18": 0.1326368677036551,
              "18-29": 0.0832178903621611,
              "30-39": 0.0835906328864075,
              "40-49": 0.1033361204013377,
              "50-59": 0.1224973366151133
              "60+": 0.1413972485314015,
           }]

如何使用 javascript 实现这种排序?

【问题讨论】:

  • 请添加您的尝试以及出了什么问题。
  • 请访问help center,使用tour查看内容和How to Ask。做一些研究,搜索关于 SO 的相关主题;如果您遇到困难,请发布您的尝试minimal reproducible example,并注明输入和预期输出。
  • 只有一个对象吗?如果是这样,为什么它在数组内?
  • 看看 Object.keys
  • @AnkitAgarwal ,它是一个大对象的一部分。为了简化,我只放了一个。

标签: javascript jquery arrays sorting


【解决方案1】:

您可以为Under+ 量词取一个偏移量并取值,具体取决于排序位置。然后返回值的增量或偏移量的增量。

稍后,您可以使用排序键构建一个新对象。

var object = { "60+": 0.1413972485314015, "18-29": 0.0832178903621611, "40-49": 0.1033361204013377, "30-39": 0.0835906328864075, "Under 18": 0.1326368677036551, "50-59": 0.1224973366151133 },
    keys = Object
        .keys(object)
        .sort((a, b) => {
            function getV(s, side) {
                var offset = { 'Under': -1, null: 0, '+': 1 }[s.match(/Under|\+/)],
                    value = s.match(/\d+/g)[offset && side];
                return { value, offset };
            }
            
            var aa = getV(a, 1),
                bb = getV(b, 0);

            return aa.value - bb.value || aa.offset - bb.offset;
        }),
   newObject = Object.assign(...keys.map(k => ({ [k]: object[k] })));

console.log(newObject);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 请阅读问题部分来自OP的cmets
  • @AnkitAgarwal,你指的是什么?
  • OP 有一个对象数组,但似乎 OP 需要对数组的第一个对象进行排序。你的输出是一个对象。我喜欢你的回答,但输出与 OP 的上下文不匹配
  • 我认为操作可以毫无问题地获取第一个对象。 op 想要什么样的输出?
  • 问题本身就在I want to sort the above array of object like下方
【解决方案2】:

您可以使用第一个字符进行排序并考虑如果第一个字符是数字则它很小,

let myObj = [{
    "60+": 0.1413972485314015,
    "18-29": 0.0832178903621611,
    "40-49": 0.1033361204013377,
    "30-39": 0.0835906328864075,
    "Under 18": 0.1326368677036551,
    "50-59": 0.1224973366151133
}];

const ordered = {};

Object.keys(myObj[0]).sort(
    function(a, b) {
        if (isNaN(Number(a.charAt(0))))
            return -1;
        if (isNaN(Number(b.charAt(0))))
            return 1;
        return a.charAt(0) - b.charAt(0);
    }

).forEach(function(key) {
    ordered[key] = myObj[0][key];
});
console.log(ordered);

【讨论】:

  • 非常感谢。我在尝试同样的事情,但在 forEach 部分犯了错误。它运行良好。
  • 已经这样做了。
【解决方案3】:

你不能直接这样做,你必须像这样改变你的结构,我认为修改后的结构也有意义。

let myObj =[{
           "60": 0.1413972485314015,
              "29": 0.0832178903621611,
              "49": 0.1033361204013377,
              "39": 0.0835906328864075,
              "18": 0.1326368677036551,
              "59": 0.1224973366151133
}]



let result  =  Object.keys(myObj[0]).sort((a,b)=> a-b).map(val=>({[val]:myObj[0][val]}));


console.log(result);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多