将具有特定值的所有项目移动到数组末尾

Move all items, with a certain value, to end of array

我有一个对象数组,每个对象都有一个 state 值。

我想对数组进行排序,以便将状态为 healthyunhealthy 的任何对象推到数组的末尾。

我想将所有 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.sortpeople 数组进行排序,如下所示:

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);

这是一个例子。

https://jsfiddle.net/lot224/xkmgrjL2/