2016-09-04 2 views
0

값이 프리미티브 (비 객체 또는 배열)이고 속성 이름이 prefix로 시작하는 경우 속성 값의 배열을 반환하는 함수를 구현하고 싶습니다. [1, true] : 나는 프리미티브의 같은 배열을 얻을 것으로 기대 values(testObj, 'a') 함수 호출의 결과로 JavaScript : 속성 값만 반환

var values = function (obj, prefix) { ... } 

var testObj = { 
    'a': 1, 
    'ab': [ 
     { 
      'c': 2, 
      'ac': true 
     } 
    ] 
}; 

예를

를 들어

.

여기 내 시도입니다 :

var values = function (obj, prefix) { 
    var res = []; 

    for (var i in obj) { 
     if (i.startsWith(prefix)) { 
      var v = obj[i]; 

      if (typeof v === 'object') { 
       var r0 = arguments.callee(v, prefix); 
       res.push(r0); 
      } else { 
       res.push(v); 
      } 
     } 
    } 

    return res; 
}; 

그러나 그것은 잘못된 결과를 반환합니다 [1, []]. 어떻게 해결할 수 있습니까?

+0

원하는 결과를 추가하십시오. –

+0

@NinaScholz'[1, true]' – Finkelson

+1

왜 당신은 1로 반환되면 중복 정보를 원하십니까? 'true'를 갖는 점 – Redu

답변

0

값에 대한 재귀 적 접근 방식을 사용할 수 있습니다.

0

function values(obj, prefix) { 
 
    var result = []; 
 
    Object.keys(obj).forEach(function (k) { 
 
     if (obj[k] !== null && typeof obj[k] === 'object') { 
 
      result = result.concat(values(obj[k], prefix)); 
 
     } else if (k.startsWith(prefix)) { 
 
      result.push(obj[k]); 
 
     } 
 
    }); 
 
    return result; 
 
} 
 

 
var testObj = { 'a': 1, 'ab': [{ 'c': 2, 'ac': true }] }, 
 
    result = values(testObj, 'a'); 
 
\t 
 
console.log(result);

은 (나의 도시 에너지가 약합니다.)

주요 문제는 i.startsWith(prefix) 상태입니다. 배열 안에 @prefix를 포함하여 속성 이름없이 객체를 입력 할 필요가 없습니다. 예를 들어 :

{ a: 1, ab: [ /* 0: { 'c': 2, 'ac': true } */ ] } 

보시다시피

는 배열의 객체는 속성 이름이 0 때문에, 즉 인덱스의 무시됩니다.

이 결과를 얻으려면 [1, true] 배열을 건너 뛰고 첫 번째 항목을 res.push으로 보내야합니다.

var values = function (obj, prefix) { 
    var res = []; 

    for (var i in obj) { 
     if (i.startsWith(prefix)) { 
      var v = obj[i]; 

      if (typeof v === 'object') { 
       var isArray = v instanceof Array; 
       var r0 = arguments.callee(isArray ? v[0] : v, prefix); 
       res.push(isArray && r0.length === 1 ? r0[0] : r); 

      } else { 
       res.push(v); 
      } 
     } 
    } 

    return res; 
}; 
0

다음 코드가 작동합니다.

var testObj = { 
    'a': 1, 
    'ab': [ 
    { 
     'c': 2, 
     'ac': true 
    } 
    ] 
}; 

var values = function (obj, prefix) { 
    var res = []; 

    if(Array.isArray(obj)){ 
     for(var j in obj){ 
     res = res.concat(arguments.callee(obj[j], prefix)); 
     } 
    } 
    else if(typeof obj == "object") { 
     for (var i in obj) { 
     if (i.startsWith(prefix)) { 
      var v = obj[i]; 

      if (typeof v === 'object') { 
      res = res.concat(arguments.callee(v, prefix)); 
      } else { 
      res.push(v); 
      } 
     } 
     } 
    } 

    return res; 
}; 

console.log(values(testObj, 'a')); 
0

이것은 사용자가 원하는 것일 수 있습니다.

-1
var testObj = { 
    'a': 1, 
    'ab': [ 
    { 
     'c': 2, 
     'ac': true 
    } 
    ] 
}; 
var res = []; 
var values = function (obj, prefix) { 
    for (var i in obj) { 
    var v = obj[i]; 
    //Prefix check line can be moved here if you want to check the prefix for object 
    if (typeof v === 'object') { 
     arguments.callee(v, prefix); 
    } else { 
     if (i.startsWith(prefix)) { //Prefix Check 
      res.push(v); 
     } 
    } 
    } 
    return res; 
}; 
console.log(values(testObj,'a')); 

이를 확인하시기 바랍니다

var testObj = { 
 
       'a': 1, 
 
       'ab': [ 
 
         { 
 
         'c': 2, 
 
         'ac': true 
 
         } 
 
        ] 
 
       }; 
 
    getValues = (o,x) => Object.keys(o) 
 
          .reduce((p,k) => p.concat(typeof o[k] === "object" ? getValues(o[k],x) 
 
                       : k.indexOf(x) >= 0 ? o[k] 
 
                            : []) 
 
            ,[]); 
 
console.log(getValues(testObj,"a"));
, 이것은 당신이 원하는 출력을 제공합니다.