【问题标题】:JS Lodash: Sort object by value, null lastJS Lodash:按值排序对象,最后为空
【发布时间】:2014-09-08 08:48:36
【问题描述】:

编辑:

我必须将 1 个大对象中的多个内容发送到服务器。对象的一部分包含可以是字符串或空值的数据。我想对我的对象进行排序,以便我的 Angular ng-repeat 首先显示已经填写的字段,然后是其余字段。

(我知道我应该只使用 PUT 将更新的字段发送到服务器,但这不是现在的选择。)


我从一个 JSON 对象开始,如下所示:

var myObject = {
    14   : "a",
    368  : null,
    7800 : null,
    3985 : "b",
    522  : "c"
}

我想对这个对象进行排序,以便所有不为空的东西都排在第一位,就像这样:

{
    14   : "a",
    3985 : "b",
    522  : "c",
    368  : null,
    7800 : null
}

我已经在这里找到了各种答案,但没有一个真正有效。我已经尝试过这样的事情,但是排序不正确:

var sortEmptyLast = function (a, b) {
    return ((a.v.length < b.v.length) ? 1 : ((a.v.length > b.v.length) ? -1 : 0));
};

var myArray = [];

for (var key in myObject) {
    var value = myObject[key] || "";
    myArray.push({k: key, v: value});
}

myArray = myArray.sort(sortEmptyLast);

var sortedObject = _.zipObject(_.map(myArray, function (x) {
     return [x.k, x.v];
}));

我的sortedObject 会返回这个:

{
    14   : "a", 
    368  : "", 
    522  : "c", 
    3985 : "b", 
    7800 : ""
}

我预计我在这里过于复杂了,所以如果有人知道进行这种排序的更简单(或至少;工作)方法 - 请赐教:)。

【问题讨论】:

  • sortedObject 应该是一个列表,因为对象属性从不排序,但列表中的项目是。你想用sortedObject 的有序属性实现什么?
  • 对象无法排序。
  • 您能否描述一下您要解决的真正问题,而不是您提供的“几乎”有效的解决方案? ) 另外,您是否检查过相关问题(例如this one)?
  • 编辑了我的问题,希望您现在能更好地理解它。
  • 如前所述,对象无法排序。保持数组中的顺序。

标签: javascript angularjs sorting object lodash


【解决方案1】:

如上所述,对象没有明确的顺序。您可以将对象发送到服务器并在视图中对对象进行排序(在您的情况下为 AngularJS 应用程序)。

要从对象创建一个有序列表,首先显示null 值,从对象创建一个列表并使用AngularJS orderBy 过滤器。

AngularJS 控制器:

var result = [];
var keys = _.keys(sortedObject);
angular.forEach(keys, function (key) {
    result.push(sortedObject[key]);
});
$scope.arrayFromObject = result;

AngularJS 视图

<span ng-repeat="item in arrayFromObject | orderBy:'name'"></span>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2015-11-02
    • 2018-11-03
    • 2015-11-27
    相关资源
    最近更新 更多