Javascript排序有两个属性

Javascript sorting with two properties

本文关键字:两个 属性 排序 Javascript      更新时间:2023-09-26

我正在努力排序两个级别。逻辑如下。如果任何对象都有状态,则返回最近的具有状态的对象。如果所有对象都没有状态,则返回最近的没有状态的对象。

var apps = [
  { status: 'PASS', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)
  },
  { status: 'FAIL',
    date_created: Thu Sep 02 2015 17:24:45 GMT-0700 (PDT),
  },
  { status: '',
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT),
  }
]
var desired_result = [{ status: 'PASS', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)
  }]
var apps_2 = [
  { status: '', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)
  },
  { status: '',
    date_created: Thu Sep 02 2015 17:24:45 GMT-0700 (PDT),
  },
  { status: '',
    date_created: Thu Sep 01 2015 17:24:45 GMT-0700 (PDT),
  }
]
var desired_resul2 = [{ status: '', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)
  }]

I've try

var sorted = _.sort_by(apps, function (x) { x.date_updated });

我也看了一些其他SO问题,但不能在第一次排序后保持对象到位。

如果我正确理解你的问题,这是你正在寻找的。http://jsfiddle.net/whxu5sea/3/

您需要过滤元素以确保它们具有任意类型的状态。然后按日期排序,最早的优先。然后得到第一个值。在我的例子中,我假设日期是字符串,但仍然应该工作。

var apps = [
  { status: 'PASS', 
    date_created: 'Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)'
  },
  { status: 'FAIL',
    date_created: 'Thu Sep 02 2015 17:24:45 GMT-0700 (PDT)',
  },
  { status: '',
    date_created: 'Thu Sep 01 2015 17:24:45 GMT-0700 (PDT)',
  }
];
var x;
var arr = _.filter(apps, function(data) {
    return !!data.status.length;
});
x = _.chain( arr.length ? arr : apps )
    .sortBy(function(data) {
        return new Date(data.date_created).getTime();
    }).last().value();
console.log( x );

检查在没有提供状态时是否工作:http://jsfiddle.net/whxu5sea/4/

我希望这对你有帮助。如果需要进一步澄清,请联系LMK。

编辑:更新获取最新元素

这是一个简单的解决方案,它只迭代一次apps,没有过滤步骤。

这个概念是,如果status是假的,它的日期被转换成一个负数,在所有假元素中保持正确的排序顺序,但使所有假元素的排序顺序低于所有非假元素的排序顺序。

我们通过减去8640000000000001来转换假元素日期,这是(日期中的最大毫秒数加1)。

var x = _.chain(apps).sortBy(function(x) {
      var date = new Date(x.date_created).getTime();
      return x.status ? date : date - 8640000000000001;
    }).last().value();
console.log( x );