【问题标题】:JavaScript sort array of object based on the value (conditional sorting)JavaScript 根据值对对象数组进行排序(条件排序)
【发布时间】:2018-11-01 23:07:02
【问题描述】:

我有一个这样的数组:

[{"category_id":101,"category_name":"abc","state":null},
{"category_id":204,"category_name":"test","state":null},
{"category_id":7,"category_name":"pqr","state":"1526985908122"},
{"category_id":103,"category_name":"User","state":null},
{"category_id":2,"category_name":"System","state":null},
{"category_id":205,"category_name":"xyz","state":"1526985908019"},
{"category_id":203,"category_name":"dash","state":null},
{"category_id":4,"category_name":"hello","state":null},
{"category_id":206,"category_name":"demo","state":"1526985908187"},
{"category_id":6,"category_name":"about","state":null},
{"category_id":3,"category_name":"role","state":null}]

我想根据 state 属性的值对这个数组进行排序,就像你在这里看到 state 有 null 和一些数值一样。

如果 state != null 然后按升序排序并且 如果 state == null 然后按降序排序(基于类别 id)

所以实际结果应该是这样的:

[{"category_id":205,"category_name":"xyz","state":"1526985908019"},
{"category_id":7,"category_name":"pqr","state":"1526985908122"},
{"category_id":206,"category_name":"demo","state":"1526985908187"},
{"category_id":204,"category_name":"test","state":null},
{"category_id":203,"category_name":"dash","state":null},
{"category_id":103,"category_name":"User","state":null},
{"category_id":101,"category_name":"abc","state":null},
{"category_id":6,"category_name":"about","state":null},
{"category_id":4,"category_name":"hello","state":null},
{"category_id":3,"category_name":"role","state":null},
{"category_id":2,"category_name":"System","state":null}]

所以它应该根据状态值对前3条记录进行升序排序,其他记录根据空值根据类别id降序排序。

这是我尝试参考这篇文章的内容: https://technology.amis.nl/2007/08/24/how-to-fix-your-number-sorting-problems-in-javascript/

var ALMOST_ZERO = -0.00000001;  
records.sort(function(a,b){         
    console.log(`comparing ${a.state},${b.state}`);
    var left = a.state != null ? a.state : ALMOST_ZERO;
    var right = b.state != null ? b.state : ALMOST_ZERO;    
    return right-left;
});

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 是的。更新代码。
  • 那么当你尝试排序功能时会发生什么?
  • @JJJ:它按降序对所有内容进行排序

标签: javascript jquery arrays json sorting


【解决方案1】:

var data = [{
        "category_id": 101,
        "category_name": "abc",
        "state": null
    },
    {
        "category_id": 204,
        "category_name": "test",
        "state": null
    },
    {
        "category_id": 7,
        "category_name": "pqr",
        "state": "1526985908122"
    },
    {
        "category_id": 103,
        "category_name": "User",
        "state": null
    },
    {
        "category_id": 2,
        "category_name": "System",
        "state": null
    },
    {
        "category_id": 205,
        "category_name": "xyz",
        "state": "1526985908019"
    },
    {
        "category_id": 203,
        "category_name": "dash",
        "state": null
    },
    {
        "category_id": 4,
        "category_name": "hello",
        "state": null
    },
    {
        "category_id": 206,
        "category_name": "demo",
        "state": "1526985908187"
    },
    {
        "category_id": 6,
        "category_name": "about",
        "state": null
    },
    {
        "category_id": 3,
        "category_name": "role",
        "state": null
    }
];


var valueWithoutNull = data.filter(val => val.state != null);
var valueWithNull = data.filter(val => val.state == null);

valueWithoutNull = valueWithoutNull.sort((a, b) => a.state - b.state);

var result = [...valueWithoutNull, ...valueWithNull];

console.log(result);

var data = [{
        "category_id": 101,
        "category_name": "abc",
        "state": null
    },
    {
        "category_id": 204,
        "category_name": "test",
        "state": null
    },
    {
        "category_id": 7,
        "category_name": "pqr",
        "state": "1526985908122"
    },
    {
        "category_id": 103,
        "category_name": "User",
        "state": null
    },
    {
        "category_id": 2,
        "category_name": "System",
        "state": null
    },
    {
        "category_id": 205,
        "category_name": "xyz",
        "state": "1526985908019"
    },
    {
        "category_id": 203,
        "category_name": "dash",
        "state": null
    },
    {
        "category_id": 4,
        "category_name": "hello",
        "state": null
    },
    {
        "category_id": 206,
        "category_name": "demo",
        "state": "1526985908187"
    },
    {
        "category_id": 6,
        "category_name": "about",
        "state": null
    },
    {
        "category_id": 3,
        "category_name": "role",
        "state": null
    }
];

data = data.sort(function(a, b) {
    if (a.state == null)
        return 1;
    if (b.state == null)
        return -1;

    return a.state - b.state;
});

console.log(data);

【讨论】:

  • 感谢您的回答,但它与所需的输出不匹配。它应该在 asc 中排序状态(如果不是 null),然后在 desc 中排序 null(如果状态为 null)。
  • 我更新了第二个选项,并在第一个选项中检查您的问题。
【解决方案2】:

尝试关注

var arr = [{"category_id":101,"category_name":"abc","state":null},{"category_id":204,"category_name":"test","state":null},{"category_id":7,"category_name":"pqr","state":"1526985908122"},{"category_id":103,"category_name":"User","state":null},{"category_id":2,"category_name":"System",state:null},{"category_id":205,"category_name":"xyz","state":"1526985908019"},{"category_id":203,"category_name":"dash","state":null},{"category_id":4,"category_name":"hello","state":null},{"category_id":206,"category_name":"demo","state":"1526985908187"},{"category_id":6,"category_name":"about","state":null},{"category_id":3,"category_name":"role","state":null}];

arr.sort((a,b) => {
  // If both null, sort by category_id descending
  if(!a.state && !b.state) return b.category_id - a.category_id;
  // if first value is null, swap
  else if(!a.state) return 1;
  // if second value is null, no change 
  else if (!b.state) return -1;
  // if both have values sort by state ascending.
  else return a.state - b.state;
})

console.log(arr);

【讨论】:

    【解决方案3】:

    这是一个简洁的版本。通过使用||,只要上面的表达式计算为 0,它就会继续测试下一个较低的表达式:

    const arr=[{"category_id":101,"category_name":"abc","state":null},{"category_id":204,"category_name":"test","state":null},{"category_id":7,"category_name":"pqr","state":"1526985908122"},{"category_id":103,"category_name":"User","state":null},{"category_id":2,"category_name":"System",state:null},{"category_id":205,"category_name":"xyz","state":"1526985908019"},{"category_id":203,"category_name":"dash","state":null},{"category_id":4,"category_name":"hello","state":null},{"category_id":206,"category_name":"demo","state":"1526985908187"},{"category_id":6,"category_name":"about","state":null},{"category_id":3,"category_name":"role","state":null}]
    
    arr.sort((a, b) => (
      (a.state === null) - (b.state === null)
      || a.state - b.state
      || b.category_id - a.category_id
    ));
    console.log(arr);

    主机版:

    ES5 版本:

    var arr = [{ "category_id": 101, "category_name": "abc", "state": null }, { "category_id": 204, "category_name": "test", "state": null }, { "category_id": 7, "category_name": "pqr", "state": "1526985908122" }, { "category_id": 103, "category_name": "User", "state": null }, { "category_id": 2, "category_name": "System", state: null }, { "category_id": 205, "category_name": "xyz", "state": "1526985908019" }, { "category_id": 203, "category_name": "dash", "state": null }, { "category_id": 4, "category_name": "hello", "state": null }, { "category_id": 206, "category_name": "demo", "state": "1526985908187" }, { "category_id": 6, "category_name": "about", "state": null }, { "category_id": 3, "category_name": "role", "state": null }];
    
    arr.sort(function (a, b) {
      return (a.state === null) - (b.state === null) || a.state - b.state || b.category_id - a.category_id;
    });
    console.log(arr);

    【讨论】:

    • 输出是正确的,但是当我在 chrome 控制台上执行此操作时,它的排序不正确
    • 在控制台中为我工作。
    • 排序如下:205, 2, 206,204,203,7,101,6,4,3,103
    • 刚刚检查了响应:typeof(records) 是对象。是因为这个吗??
    • 数组对象。请参阅编辑以了解它在我的控制台中的外观;听起来你的问题在别处
    【解决方案4】:

    @sky,试试下面的解决方案

    <!DOCTYPE html>
    <html>
    <head>
    <title>Page Title</title>
    <script>
    var test= [{"category_id":101,"category_name":"abc","state":null},
    {"category_id":204,"category_name":"test","state":null},
    {"category_id":7,"category_name":"pqr","state":"1526985908122"},
    {"category_id":103,"category_name":"User","state":null},
    {"category_id":2,"category_name":"System","state":null},
    {"category_id":205,"category_name":"xyz","state":"1526985908019"},
    {"category_id":203,"category_name":"dash","state":null},
    {"category_id":4,"category_name":"hello","state":null},
    {"category_id":206,"category_name":"demo","state":"1526985908187"},
    {"category_id":6,"category_name":"about","state":null},
    {"category_id":3,"category_name":"role","state":null}];
    
     function sortByKeyAsc(array, key) {
            return array.sort(function (a, b) {
                var x = a[key]; var y = b[key];
                return ((x < y) ? -1 : ((x > y) ? 1 : 0));
            });
        }
    function sortByKeyDesc(array, key) {
        return array.sort(function (a, b) {
            var x = a[key]; var y = b[key];
            return ((x > y) ? -1 : ((x < y) ? 1 : 0));
        });
    }
    console.log(sortByKeyDesc(test,"state")  );
    </script>
    </head>
    <body>
    
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2013-11-25
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 2020-04-21
      • 2016-05-14
      • 2017-09-29
      • 2021-04-26
      相关资源
      最近更新 更多