부울 속성으로 객체의 Javascript 정렬 배열
실제 문제는 끝에 편집을 참조하십시오.
좋아,이 시나리오가 있습니다.
a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
그런 다음 이렇게하면 :
a.sort(function(a,b){return !a && b});
나에게 이것을 준다 :
[false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
그것은 일종의 정렬을하고 있지만 ... 그렇지는 않습니다 ... :(
이 배열을 어떻게 정렬합니까?
편집하다:
왜 내가 a.sort ()를 사용하지 않았는지 궁금하다면 실제 배열이 내가 게시 한 것과 같은 일반 배열이 아니라 객체이기 때문입니다. 진짜는 [{xx : true}, {xx : false}, ...]와 같은 요소를 가지고 있습니다.
a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
a.sort(function(x, y) {
// true values first
return (x === y)? 0 : x? -1 : 1;
// false values first
// return (x === y)? 0 : x? 1 : -1;
});
console.log(a);
a와 b가 모두 같은 값을 가질 때 0을 반환하고, a가 참이면 -1을, 그렇지 않으면 1을 반환해야합니다.
더 간단한 방법 :
a = [{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false}];
a.sort(function(a,b){return a.xx-b.xx});
console.log(a);
다른 방식으로 정렬하려면 sort () 다음에 a.reverse ()를 호출 할 수 있습니다.
편집 : 부울 배열 대신 개체 배열 정렬에 대한 업데이트 된 질문을 반영하도록 편집되었습니다.
간단한 솔루션 :
[true, false, true, false].sort( (a,b) => b - a)
암시 적 유형 변환 (TypeScript와 같은 언어가 싫어하는 언어)을 방지하려면를 사용 Number()
하여 부울을 숫자로 명시 적으로 변환 할 수 있습니다 .
a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
a.sort(function(x, y) {
return Number(x) - Number(y);
});
console.log(a);
또는 화살표 기능 사용 :
a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
a.sort((x, y) => Number(x) - Number(y));
console.log(a);
배열에는 동일한 위치가 없으므로 등호 확인을 생략하고 항상 -1 또는 1을 반환합니다.이 방법은 TS에서 잘 작동합니다.
a.sort(x => x ? -1 : 1)
참고 : 이것이 정렬 기능의 내부에 어떤 영향을 미치는지 약간 걱정되지만 트릭을 수행하는 것 같습니다.
역 정렬을 원할 경우
a.sort(x => !x ? -1 : 1)
PFB 솔루션은 Typescript Angular 2에서도 저에게 효과적이었습니다.
let a = [{aa:"1",xx:true},{aa:"10",xx:false},{aa:"2",xx:true},{aa:"11",xx:false},{aa:"3",xx:true},{aa:"12",xx:false},{aa:"4",xx:true},{aa:"13",xx:false},{aa:"5",xx:true},{aa:"14",xx:false},{aa:"6",xx:true},{aa:"15",xx:false},{aa:"7",xx:true},{aa:"16",xx:false},{aa:"8",xx:true},{aa:"17",xx:false},{aa:"9",xx:true},{aa:"18",xx:false}];
//a.sort(function(a,b){return a.xx-b.xx});
a.sort(function (x, y) {
// true values first
return (x.xx === y.xx) ? 0 : x ? -1 : 1;
// false values first
// return (x === y)? 0 : x? 1 : -1;
});
return JSON.stringify(a);
비교 함수에 대한 매우 간단한 해결책 a < b
은 숫자로 변환 할 때 0 또는 1을 제공 하는지 확인 하는 것입니다. 그런 다음 0을 -1로, 1을 1로 매핑하려고합니다. 이렇게하려면 2를 곱한 다음 1을 빼면됩니다.
data.sort(function (a, b) {
return (a < b) * 2 - 1
}
아니면 그냥
data.sort((a, b) => (a < b) * 2 - 1)
문제가 분류되었습니다!
If any of your values are null
they are treated as false (null*2 === 0
) and any value that is undefined
will become NaN
(undefined*2 === NaN
) which should make it last in either sort direction.
ReferenceURL : https://stackoverflow.com/questions/17387435/javascript-sort-array-of-objects-by-a-boolean-property
'programing' 카테고리의 다른 글
NSArray에서 최대 숫자 값 찾기 (0) | 2021.01.16 |
---|---|
명령 줄 프롬프트의 현재 디렉터리를 줄이려면 어떻게해야합니까? (0) | 2021.01.16 |
Eric Niebler의 std :: is_function 구현은 어떻게 작동합니까? (0) | 2021.01.15 |
Docker 이미지-유형. (0) | 2021.01.15 |
분산 된 동시성 제어 (0) | 2021.01.15 |