2013-05-06 2 views
4

저는 객체 배열의 값을 확인하는 함수를 만들었지 만 어떤 이유인지 그것은 undefined을 계속 반환합니다. 왜 그런가요?forEach 함수는 return 문을 사용하더라도 정의되지 않은 값을 반환합니다.

데모 : 함수에서 http://jsfiddle.net/cNYwz/1/

var data = [{ 
    "Key": "1111-1111-1111", 
     "Email": "[email protected]" 
}, { 
    "Key": "2222-2222-2222", 
     "Email": "[email protected]" 
}]; 


function getByKey(key) {  
    data.forEach(function (i, val) { 
     if (data[val].Key === key) { 
      return data[val].Key; 
     } else { 
      return "Couldn't find"; 
     } 
    }); 
} 

var asd = getByKey('1111-1111-1111'); 
console.log(asd); 
+7

아무 것도 반환하지 않으므로. –

+2

'getByKey'의 내부 익명 함수가'asd'로 반환되지 않습니다. – Jasen

답변

10

, 당신은하지 getByKey에서 forEach에 전달 된 함수에서 반환하고 있습니다.

function getByKey(key) {  
    var found = null; 
    data.forEach(function (val) { 
     if (val.Key === key) { 
      found = val; 
     } 
    }); 
    return found; 
} 

을하지만이 항목을 바로 찾을 경우에도 모든 요소를 ​​반복 것 :

이 같은 적응할 수 있습니다. 나는 또한 값이 아닌 키를 반환하는 코드를 적용

function getByKey(key) {  
    for (var i=0; i<data.length; i++) { 
     if (data[i].Key === key) { 
      return data[i]; 
     } 
    } 
} 

참고 : 당신이 더 간단한 for 루프를 사용하는 것입니다 이유입니다. 그게 의도라고 생각해. 또한 다른 반복 함수와 혼동되었을 수 있습니다. forEach에 전달한 콜백에 전달 된 첫 번째 인수는 배열의 요소입니다.

+0

15 초 전에 일찍 도착 했으니 까. –

1

긍정적 인 결과를 변수로 저장하고 의 끝에forEach 루프 이후에 해당 변수 (또는 아무 것도 쓰여지지 않을 경우 "찾을 수 없음")를 반환 해보십시오.

function getByKey(key) {  
    var result; 

    data.forEach(function (val, i) { 
     if (data[val].Key === key) { 
      result = data[val].Key; 
     } 
    }); 

    return result || "Couldn't find"; 
} 
+0

forEach에 인수의 순서가 바뀌 었습니다. –

+0

그건 OP에서 왔어, 미안. –

1

함수 getByKey에는 return 문이 없습니다. 두 반환 값은 forEach에서 사용하는 익명 함수에 대한 반환 값입니다. Array.prototype.some를 사용

는 다른 답변에서 아이디어뿐만 아니라
function getByKey(key) {  
    var result = data.filter(function (i, val) { 
    return data[val].Key == key; 
    }); 
    return result.length ? result : 'Not found'; 
} 
0

당신은 외부 범위에 아무것도 반환하지 않는,이 대안을 시도 각각. 즉, 첫 번째 일치를 찾을 때 멈추게됩니다

function getByKey(key) {  
    var found = null; 
    data.some(function (val) { 
     if (val.Key === key) { 
      found = val; 
      return true; //stop iterating 
     } 
    }); 
    return found; 
} 
또한 단지 객체 키 일치 포함하고있는 배열을 반환 할 수 있습니다 필터를 사용하는 것이 좋습니다

:

function filter_array_by_key(key){ 
    return data.filter(function(v){ 
     return v.Key===key; 
    }; 
} 

이 첫 번째를 얻으려면을 일치하는 객체가 있으면 filter_array_by_key(key)[0]을 사용할 수 있습니다. 일치하지 않으면 undefined가됩니다.

0

, 당신이 더 낫다보다는 :

관련 문제