将具有特定值的所有项目移动到数组末尾
Move all items, with a certain value, to end of array
我有一个对象数组,每个对象都有一个 state
值。
我想对数组进行排序,以便将状态为 healthy
或 unhealthy
的任何对象推到数组的末尾。
我想将所有 healthy
个项目组合在一起,并将所有 unhealthy
个项目组合在一起。
var people = [
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'unhealthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'healthy'
}
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'unhealthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'healthy'
}
];
我希望最终数组看起来像这样:
var people = [
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'unhealthy'
},
{
name: 'XXX',
state: 'unhealthy'
}
];
我尝试了以下操作,但由于某种原因,数组中的某些项目遗漏了。
我想可能是因为我将项目推到底部,所有其他项目的索引发生了变化而我遗漏了一些?
_.each(people, function(p){
if(p.state === 'healthy'){
var arr_idx = people.indexOf(p);
people.push(people.splice(arr_idx, 1)[0]);
}
});
_.each(people, function(p){
if(p.state === 'unhealthy'){
var arr_idx = people.indexOf(p);
people.push(people.splice(arr_idx, 1)[0]);
}
});
您可以使用 Array.prototype.sort():
var people = [{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'unhealthy'},{name: 'XXX',state: 'unhealthy'}];
people.sort(function(a, b) {
return (a.name === 'healthy') ? -1 : ((b.name === 'unhealthy') ? -2 : 0);
});
console.log(people);
.as-console-wrapper{top:0;max-height:100% !important;}
使用 Array.prototype.sort
对 people
数组进行排序,如下所示:
var people = [{name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state:'unhealthy'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state:'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'unhealthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'healthy'}];
people.sort(function(a, b) {
if(a.state === 'healthy' ||
a.state === 'unhealthy')
return 1;
else
return -1;
});
console.log(people);
.as-console-wrapper{top:0;max-height:100% !important;}
您可以使用对象进行排序。
var people = [{ name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'other' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'unhealthy' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'other' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'other' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'other' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'unhealthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'healthy' }];
people.sort(function (a, b) {
var order = { healthy: 1, unhealthy: 2 }; // easy to maintain
return (order[a.state] || 0) - (order[b.state] || 0); // return delta of order
});
console.log(people);
您也可以使用array.sort
来排序值
var people = [{name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state:'unhealthy'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state:'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'unhealthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'healthy'}];
var orderMap = {
'healthy': 10,
'unhealthy': 11,
}
people.sort(function(a,b){
var _a = a.state;
var _b = b.state;
var o_a = orderMap[_a];
var o_b = orderMap[_b];
if(o_a) return 1;
else if (o_b) return -1;
else return _a > _b ? 1 : _a < _b ? -1 : 0
});
console.log(people)
试试这个:
var people = [{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'unhealthy'},{name: 'XXX',state: 'unhealthy'}];
console.log(_.sortBy(people,function(p, index){
return p.name == 'healthy' ? -1 : ( p.name == 'unhealthy' ? -2 : index);
}))
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
一个简单的比较函数就可以解决问题。
function test(a,b) {
if (a.state === b.state) return 0;
if (a.state === 'unhealthy') return .5;
if (a.state === 'healthy') return 1;
return -1
}
var sortedArray = people.sort(test);
这是一个例子。
我有一个对象数组,每个对象都有一个 state
值。
我想对数组进行排序,以便将状态为 healthy
或 unhealthy
的任何对象推到数组的末尾。
我想将所有 healthy
个项目组合在一起,并将所有 unhealthy
个项目组合在一起。
var people = [
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'unhealthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'healthy'
}
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'unhealthy'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'healthy'
}
];
我希望最终数组看起来像这样:
var people = [
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'other'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'dead'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'healthy'
},
{
name: 'XXX',
state: 'unhealthy'
},
{
name: 'XXX',
state: 'unhealthy'
}
];
我尝试了以下操作,但由于某种原因,数组中的某些项目遗漏了。
我想可能是因为我将项目推到底部,所有其他项目的索引发生了变化而我遗漏了一些?
_.each(people, function(p){
if(p.state === 'healthy'){
var arr_idx = people.indexOf(p);
people.push(people.splice(arr_idx, 1)[0]);
}
});
_.each(people, function(p){
if(p.state === 'unhealthy'){
var arr_idx = people.indexOf(p);
people.push(people.splice(arr_idx, 1)[0]);
}
});
您可以使用 Array.prototype.sort():
var people = [{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'unhealthy'},{name: 'XXX',state: 'unhealthy'}];
people.sort(function(a, b) {
return (a.name === 'healthy') ? -1 : ((b.name === 'unhealthy') ? -2 : 0);
});
console.log(people);
.as-console-wrapper{top:0;max-height:100% !important;}
使用 Array.prototype.sort
对 people
数组进行排序,如下所示:
var people = [{name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state:'unhealthy'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state:'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'unhealthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'healthy'}];
people.sort(function(a, b) {
if(a.state === 'healthy' ||
a.state === 'unhealthy')
return 1;
else
return -1;
});
console.log(people);
.as-console-wrapper{top:0;max-height:100% !important;}
您可以使用对象进行排序。
var people = [{ name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'other' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'unhealthy' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'other' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'other' }, { name: 'XXX', state: 'healthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'other' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'unhealthy' }, { name: 'XXX', state: 'dead' }, { name: 'XXX', state: 'healthy' }];
people.sort(function (a, b) {
var order = { healthy: 1, unhealthy: 2 }; // easy to maintain
return (order[a.state] || 0) - (order[b.state] || 0); // return delta of order
});
console.log(people);
您也可以使用array.sort
来排序值
var people = [{name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state:'unhealthy'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state:'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'healthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'other'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'unhealthy'}, {name: 'XXX',state: 'dead'}, {name: 'XXX',state: 'healthy'}];
var orderMap = {
'healthy': 10,
'unhealthy': 11,
}
people.sort(function(a,b){
var _a = a.state;
var _b = b.state;
var o_a = orderMap[_a];
var o_b = orderMap[_b];
if(o_a) return 1;
else if (o_b) return -1;
else return _a > _b ? 1 : _a < _b ? -1 : 0
});
console.log(people)
试试这个:
var people = [{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'other'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'dead'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'healthy'},{name: 'XXX',state: 'unhealthy'},{name: 'XXX',state: 'unhealthy'}];
console.log(_.sortBy(people,function(p, index){
return p.name == 'healthy' ? -1 : ( p.name == 'unhealthy' ? -2 : index);
}))
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
一个简单的比较函数就可以解决问题。
function test(a,b) {
if (a.state === b.state) return 0;
if (a.state === 'unhealthy') return .5;
if (a.state === 'healthy') return 1;
return -1
}
var sortedArray = people.sort(test);
这是一个例子。