2016-10-07 3 views
1

그래서 각 속성이 배열 인 객체를 전달해야합니다. 이 함수는 각 배열에 보유 된 정보를 사용하지만 각 배열이 비어 있는지 여부를 확인하여 전체 객체가 빈 상태 (비어있는 속성이 아님)가 아닌지 확인하려고합니다.개체의 배열이 모두 비어 있는지 확인하는 방법?

function isUnPopulatedObject(obj) { // checks if any of the object's values are falsy 
    if (!obj) { 
     return true; 
    } 

    for (var i = 0; i < obj.length; i++) { 
     console.log(obj[i]); 
     if (obj[i].length != 0) { 
      return false; 
     }  
    } 

    return true; 
} 

그래서 예를 들어, 위가 false을 당할 것입니다 : 내가 지금까지 가지고

obj { 
    0: Array[0] 
    1: Array[1] 
    2: Array[0] 
} 

를이 내가 확인하고있어 빈하는 동안 (사실) :

obj { 
    0: Array[0] 
    1: Array[0] 
    2: Array[0] 
} 

위의 코드는 작동하지 않습니다. 미리 감사드립니다.

답변

4

을 사용을 사용 해당 객체가 수표를 전달하면 Object.keys을 사용할 수 있습니다. 추가 every과 같이 배열 번호 :이 부울 값으로 allEmpty을 설정합니다

var allEmpty = Object.keys(obj).every(function(key){ 
return obj[key].length === 0 
}) 

(참/거짓), 때마다 우리는 obj[key].length === 0 true를 반환 여부를 주어진 검사를 실행할 경우에 따라 달라집니다.

이 객체는 참으로 allEmpty을 설정

var obj = { 
    0: [], 
    1: [], 
    2: [] 
} 

을이 false로 설정하면서 :

object
var obj = { 
    0: [], 
    1: [], 
    2: [], 
    3: [1] 
} 
+0

고마워요! 그것은 그러한 해결책이었고, 객체가 배열과 같은 길이가 없다는 것을 깨닫지 못했습니다. – LaLaLottie

1

개체에 length 속성이 없으므로 작동하지 않습니다.

보십시오이 간단한

function isUnPopulatedObject(obj) { 
    return Object.keys(obj).filter(function(key){ 
     return obj[ key ].length > 0; //if any array has a property then filter will return this key. 
    }).length == 0; //used == here since you want to check if all are empty 
} 

또는 우리가 객체를 통해 이동하고 모든 키의 경우 찾으려는 경우 every

function isUnPopulatedObject(obj) { 
    return Object.keys(obj).every(function(key){ 
     return obj[ key ].length == 0; 
    }); 
} 

정도 some

function isUnPopulatedObject(obj) { 
    return Object.keys(obj).some(function(key){ 
     return obj[ key ].length > 0; 
    }) === false; 
} 
+0

의 최신 버전에서만 작동합니다, 당신은 사용해야합니다'.every()'또는'.some()'를 사용하면 새로운 배열을 작성하지 않고 가능할 때 최대한 빨리 종료 할 수 있습니다. 사용중인 것은 jQuery 결함에 대한 일반적인 해결 방법입니다. –

+0

필터링 대신'.some()'을 사용하십시오. 중간 배열을 만들지 않습니다. – 4castle

+0

@squint'every '이 더 좋게 보입니다. – gurvinder372

2

은 길이 속성이 없습니다. 객체 값을 반복하는 다른 방법이 몇 가지 있습니다.이 값은 find이어야합니다.

값이 배열인지 확인하려면 Array.isArray을 사용할 수 있습니다. 예를 들어

:

function objectIsEmpty(obj) { 
 
    return Object.keys(obj).every(function(key) { 
 
     var val = obj[key]; 
 
     
 
     if (Array.isArray(val) && val.length === 0) { 
 
     return true; 
 
     } 
 
     
 
     // Other rules go here: 
 
     // ... 
 
     
 
     return false; 
 
    }); 
 
}; 
 

 

 
console.log(objectIsEmpty({ 0: [], 1: [], 2: [] })); 
 
console.log(objectIsEmpty({ 0: [], 1: [1], 2: [] }));

+1

해답을 가져 주셔서 감사합니다. – LaLaLottie

1

이 도시에서 새로운 아이를 사용하여 시작 흥미로운 일이 될 수 있습니다. Object.values()

var o1 = {0: [], 1: [1], 2: []}, 
    o2 = {0: [], 1: [], 2: []}, 
chkObj = o => Object.values(o).every(a => a.length === 0); 
console.log(chkObj(o1)); 
console.log(chkObj(o2)); 

참고 :이 부울 결과 크롬, 오페라와 FF

+0

답변 해 주셔서 감사합니다. – LaLaLottie

관련 문제