2016-10-24 2 views
2

У меня есть массив объектов, есть значение state для каждого объекта.Переместить все элементы с определенным значением до конца массива

Я хотел бы заказать массив, чтобы любые объекты obejects с состоянием 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]); 
    } 
}); 

ответ

2

Вы можете использовать объект для заказа на сортировку.

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

+1

Спасибо, Нина, очень благодарен. – Daft

2

Вы можете использовать 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;}

1

Использование 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;}

0

Вы также можете использовать 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)

0

Попробуйте это:

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){ 
 
\t 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>

0

Простая функция сравнения следует сделать трюк.

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/