2016-08-26 2 views
5

을 전원 ==을 가지고 모든 배열을 제거나는 유스 케이스가 0

[ 
    { 
    "name": "cab", 
    "child": [ 
     { 
     "name": "def", 
     "child": [ 
      { 
      "name": "ghi", 
      "power": "0.00", 
      "isParent": false 
      } 
     ], 
     "power": "1.23", 
     "isParent": true 
     } 
    ], 
    "power": "1.1", 
    "isParent": true 
    }, 
    { 
    "name": "hhi", 
    "child": [ 
     { 
     "name": "hhi2", 
     "child": [ 
      { 
      "name": "hhi3", 
      "power": "0.00", 
      "isParent": false 
      } 
     ], 
     "power": "1.23", 
     "isParent": true 
     } 
    ], 
    "power": "1.1", 
    "isParent": true 
    } 
] 

을 나는 힘이 모든 개체를 제거 할 필요 == 0 배열의 단순한 콜렉션에서 필터를 사용하기는 쉽지만, n 개의 자식 수가 n 개의 자식을 포함 할 수 있습니다.

미리 감사드립니다.

+1

당신은 무엇 재귀 아십니까? –

+2

당신의 목적은''0.00 '''0'이라고 생각되는 문자열입니까? 또한 상위 항목의 전원이 0이지만 자식의 전원이 0이 아닌 경우 상위 항목 (따라서 모든 하위 항목)을 제거해야합니까? – nnnnnn

+0

@nnnnnn, 0.00은 문자열이고 power == 0.00은 검사 여야합니다. –

답변

5

그냥 재귀 함수와 배열을 반복 json으로 자녀 이상

  1. 으로 반복.
  2. 전원이 "0.00"인지 확인하십시오. 이 아이들
    • 이있는 경우
      • 이 경우 제거가 이상은, 다음 반복 않는 경우
    • 확인 (null을 반환) (단계로 이동 2)
  3. JSON 요소를 반환합니다.
+1

그럴 겁니다 :) –

+0

[for ... in을 사용하여 배열을 반복하지 마십시오] (http://stackoverflow.com/q/500504/5743988). 'i'라고 선언하면 글로벌을 만들지 않습니다. – 4castle

+0

Gotcha @ 4castle –

2

개체를 반복적으로 반복하면서 매번 자식을 찾고 전원 === 0 또는 요구 사항이 무엇인지 필터링하십시오.

재귀 사용 방법을 모른다면 here is a tutorial을 사용해보십시오. 정말 누군가가 나에게 와서 당신이 문제에 대한 정확한 해결책을 건네 주길 바란다. 이것은 재귀를 사용하는 방법을 알게되면 스스로 해결할 수 있어야하기 때문이다. 또한 루프를 사용할 수도 있지만 재귀가 가장 좋습니다.

편집 :이 문제는 before, 다른 맛으로 해결되었지만 모두 동일합니다. 구현에 버그가있는 것으로 밝혀지면 파악할 수없는 버그가 있습니다. 새로운 질문에 대해 언급 해 주시면 최선을 다해 도와 드리겠습니다.

var json = ["JSON_HERE"]; 
function deleteIterator(json) { 
    if(json.power == "0.00") { 
    return null; 
    } else if(json.child) { 
    json.child = deleteIterator(json.child); 
    } 
    return json; 
} 
for(var i = 0; i < json.length; i++) { 
    json[i] = deleteIterator(json[i]); 
} 

이것이하는 일은 다음과 같습니다 :

+3

예 가능한 개체입니다. 대답. 그 사람은 어떻게하는지 알고 싶어합니다. 나는 그에게 어떻게 보여 주었다. 정확한 코드를 제공해야 할 필요는 없으며 그렇게하는 것이 바람직하지 않다고 생각합니다. 우리는 SO 사용자가이 사이트를 "붙여 넣기를 복사하고 이해할 수없는 코드를 묻고받습니다"라고 생각해서는 안됩니다. 대신 사람들에게 문제를 스스로 해결할 수있는 방법을 제공하십시오. –

+0

@patrik : 당신이 의미하는 것을 이해했습니다. 다시 한 번 감사드립니다 :) –

1
명명 된 함수 표현식으로 Array#filter를 사용하여 재귀 적으로 반복 할 수

:

var objArray = [{"name":"cab","child":[{"name":"def","child":[{"name":"ghi","power":"0.00","isParent":false}],"power":"1.23","isParent":true}],"power":"1.1","isParent":true},{"name":"hhi","child":[{"name":"hhi2","child":[{"name":"hhi3","power":"0.00","isParent":false}],"power":"1.23","isParent":true}],"power":"1.1","isParent":true}]; 
 

 
objArray = _.filter(objArray, function powerFilter(o) { 
 
    if (o.power == 0) return false; 
 
    if (o.isParent && o.child) { 
 
    o.child = _.filter(o.child, powerFilter); // recursive call 
 
    o.isParent = o.child.length > 0; 
 
    if (!o.isParent) delete o.child; 
 
    } 
 
    return true; 
 
}); 
 

 
console.log(objArray);
<script src="https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js"></script>

+0

그 여분의'return' 문에 오타가 있습니까? 또한,'filter()'함수의 그 콜백 함수의 이름을 지어야합니까 (convention은 익명의 함수입니다, 정확합니까?) –

+0

@LambdaNinja 재귀 적으로 참조하기 위해서는 이름을 붙여야합니다. 참조를 위해 [이 대답] (http://stackoverflow.com/a/38132582/5743988)을보십시오. 오타가 뭐니? – 4castle

+0

편집에 오타가 수정되어 이전에 이름의 목적을 알지 못했습니다. 좋은 해결책. +1. –