Javascript 使用两个属性排序
Javascript sorting with two properties
我正在努力对两个级别进行排序。逻辑如下。如果任何对象具有状态,则 return 具有状态的最新对象。如果 none 个对象有状态,return 个没有状态的最新对象。
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 questions,但在第一次排序后无法将对象保持在原位。
如果我没有正确理解你的问题,这就是你要查找的内容。 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
迭代一次,没有过滤步骤。 See here for a jsfiddle.
这个概念是,如果status
是假的,它的日期被转换成一个负数,保留所有假元素之间的正确排序顺序,但使所有假元素的排序顺序低于所有非虚假的。
我们通过减去 8640000000000001 来转换虚假元素日期,即(the maximimum millis in a Date,加一)。
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 );
我正在努力对两个级别进行排序。逻辑如下。如果任何对象具有状态,则 return 具有状态的最新对象。如果 none 个对象有状态,return 个没有状态的最新对象。
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 questions,但在第一次排序后无法将对象保持在原位。
如果我没有正确理解你的问题,这就是你要查找的内容。 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
迭代一次,没有过滤步骤。 See here for a jsfiddle.
这个概念是,如果status
是假的,它的日期被转换成一个负数,保留所有假元素之间的正确排序顺序,但使所有假元素的排序顺序低于所有非虚假的。
我们通过减去 8640000000000001 来转换虚假元素日期,即(the maximimum millis in a Date,加一)。
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 );