programing

부울 속성으로 객체의 Javascript 정렬 배열

sourcetip 2021. 1. 16. 11:13
반응형

부울 속성으로 객체의 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

반응형