具有两个属性的Javascript排序

具有两个属性的Javascript排序,javascript,underscore.js,Javascript,Underscore.js,我正在努力将两个级别进行分类。逻辑如下。如果任何对象具有状态,则返回具有状态的最新对象。如果没有对象具有状态,则返回没有状态的最新对象 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), },

我正在努力将两个级别进行分类。逻辑如下。如果任何对象具有状态,则返回具有状态的最新对象。如果没有对象具有状态,则返回没有状态的最新对象

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)
  }]
我试过了

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

我还查看了其他一些SO,但在第一次排序后无法将对象保持在适当的位置

如果我没弄错你的问题,这就是你要找的

您需要过滤元素,以确保它们具有任何类型的状态。然后按日期排序,最早的先排序。然后得到第一个值。在我的示例中,我假设了字符串所在的日期,但仍然可以使用

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 );
要在未提供状态时检查其是否工作:

我希望这有帮助。LMK,如果需要进一步澄清


编辑:更新以获取最新元素(最后一个)。

如果我正确理解您的问题,以下是您要查找的内容

您需要过滤元素,以确保它们具有任何类型的状态。然后按日期排序,最早的先排序。然后得到第一个值。在我的示例中,我假设了字符串所在的日期,但仍然可以使用

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 );
要在未提供状态时检查其是否工作:

我希望这有帮助。LMK,如果需要进一步澄清


编辑:更新以获取最新元素(最后一个)。

如果我正确理解您的问题,以下是您要查找的内容

您需要过滤元素,以确保它们具有任何类型的状态。然后按日期排序,最早的先排序。然后得到第一个值。在我的示例中,我假设了字符串所在的日期,但仍然可以使用

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 );
要在未提供状态时检查其是否工作:

我希望这有帮助。LMK,如果需要进一步澄清


编辑:更新以获取最新元素(最后一个)。

如果我正确理解您的问题,以下是您要查找的内容

您需要过滤元素,以确保它们具有任何类型的状态。然后按日期排序,最早的先排序。然后得到第一个值。在我的示例中,我假设了字符串所在的日期,但仍然可以使用

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 );
要在未提供状态时检查其是否工作:

我希望这有帮助。LMK,如果需要进一步澄清


编辑:更新以获取最新元素(最后一个)。

这里有一个简单的解决方案,只需在
应用程序中迭代一次,无需过滤步骤

其概念是,如果
status
为falsy,则其日期将转换为负数,在所有falsy元素中保留正确的排序顺序,但使所有falsy元素的排序顺序低于所有非falsy元素

我们通过减去8640000000000001(即(,加1)来转换falsy元素日期


这是一个简单的解决方案,只需在
应用程序中迭代一次,无需过滤步骤

其概念是,如果
status
为falsy,则其日期将转换为负数,在所有falsy元素中保留正确的排序顺序,但使所有falsy元素的排序顺序低于所有非falsy元素

我们通过减去8640000000000001(即(,加1)来转换falsy元素日期


这是一个简单的解决方案,只需在
应用程序中迭代一次,无需过滤步骤

其概念是,如果
status
为falsy,则其日期将转换为负数,在所有falsy元素中保留正确的排序顺序,但使所有falsy元素的排序顺序低于所有非falsy元素

我们通过减去8640000000000001(即(,加1)来转换falsy元素日期


这是一个简单的解决方案,只需在
应用程序中迭代一次,无需过滤步骤

其概念是,如果
status
为falsy,则其日期将转换为负数,在所有falsy元素中保留正确的排序顺序,但使所有falsy元素的排序顺序低于所有非falsy元素

我们通过减去8640000000000001(即(,加1)来转换falsy元素日期



创建的日期是字符串吗?如果任何对象具有状态,则没有称为“排序依据”的函数,请您解释清楚?如果状态不是空的,那么示例中的所有数据都具有
状态
对不起string@thefourtheye或者我可以将其返回为null而不是空字符串,如果这是easierIs
date\u created
字符串?如果任何对象具有状态,则没有称为“排序依据”的函数,请您解释清楚?如果状态不是空的,那么示例中的所有数据都具有
状态
对不起string@thefourtheye或者我可以将其返回为null而不是空字符串,如果这是easierIs
date\u created
字符串?如果任何对象具有状态,则没有称为“排序依据”的函数,请您解释清楚?如果状态不是空的,那么示例中的所有数据都具有
状态
对不起string@thefourtheye或者我可以将其返回为null而不是空字符串,如果这是easierIs
date\u created
字符串?如果任何对象具有状态,则没有称为“排序依据”的函数,请您解释清楚?如果状态不是空的,那么示例中的所有数据都具有
状态
对不起string@thefourtheye或者我可以将其返回为null,而不是空字符串,如果这更容易的话。显然,我只读了你问题的一部分,对不起!正在处理这两种情况。已修复处理这两种情况。非常接近!它无法按日期对多个状态进行排序@user2954587I只是又做了一次更新,现在使用了
last
。我认为它应该为你做这件事。请在我回家前确认:)确认!谢谢你,我在拔头发。回家:)显然我只读了你问题的一部分,对不起!