2012-04-11 2 views
1

제출할 때 양식의 유효성을 검사 할 수있는 단일 자바 스크립트 문에 배열 (값으로 다른 배열 포함)을 정의하려고했습니다.javascript에서 다차원 배열 만들기, 맞춤 함수 오류

내가 쓴 함수는 인라인 배열을 생성 (시도)

는 다음 : 자바 스크립트 디버거 변수에 그러나

window.validArr = arr(
    'f-county',arr('maxlen',10, 'minlen',1), 
    'f-postcode',arr('maxlen',8, 'minlen',6) 
); 

:

function arr(){ 
    var inc; 
    var tempa = new Array(Math.round(arguments.length/2)); 
    for(inc=0; inc<arguments.length; inc=inc+2) { 
     tempa[arguments[inc]]=arguments[inc+1]; 
    } 
    return tempa; 
} 

이이 배열을 할당 할 세 번 여기라고 가 비어 있고 arr() 함수가 아무 것도 반환하지 않습니다. 누구든지이 코드가해야 할 일에 대한 나의 기대가 왜 틀린 지 알고 있습니까?

(나는이 기능없이 배열을 생성하는 방법을 일했다,하지만이 코드가 작동하지 않는 이유가 궁금 해요 (나는 이것보다 더 나은 자바 스크립트를) 이해 생각했다.)

답변

2

자, 코드가하는 것부터 배열을 만드는 것이 아닙니다. JavaScript에서는 배열을 특별하게 만드는 것이 속성의 인덱스를 관리합니다. 그들도 다른 속성을 가질 수 있도록 그렇지 않으면 그들은 단지, 객체있어,하지만 당신은 배열로 배열을 사용하지 않는 경우 당신은뿐만 아니라 단지 개체를 사용할 수 있습니다 :

function arr(){ 
    var inc; 
    var tempa = {}; 
    for(inc=0; inc<arguments.length; inc=inc+2) { 
     tempa[arguments[inc]]=arguments[inc+1]; 
    } 
    return tempa; 
} 

디버거가이다에서 당신이보고있는 무엇을 배열을 실제 배열로 표시하려고 시도한 결과, 즉 숫자로 색인 된 속성이 표시되어야합니다. "arr()"함수를있는 그대로 호출 한 다음 결과에서 "f-county"속성을 보았 으면 (예제에서) 거기에 무엇인가가 표시됩니다.

실제 배열을 원한다면 특정 크기로 초기화 할 필요가 없습니다. 그냥 []로 새로운 배열을 만들 :

var tempa = []; 
+0

나는 종종 키 - 값 쌍을 연결하는 유연 사용 PHP 배열, 사용 해요, 그래서 JS이를 모방하려고했다 :

따라서, 자신의 리터럴 구문은 다릅니다. 감사! –

+1

그래, 그게 일반적인 혼란의 원천이야. 자바 스크립트가 배열 객체의 일반 문자열 이름 붙은 속성에 완벽하게 괜찮다는 사실 때문에 더 나아지지 않았다. :-) – Pointy

1

귀하의 코드가 작동합니다. 변수를 검사하면 어레이에 사용자 정의 키가 있음을 알 수 있습니다. 확장되지 않으면 디버거는 간단한 구문으로 (숫자로 된) 수치를 표시합니다. 아무 것도 표시하지 않습니다.

그러나 배열과 개체의 차이점을 이해해야 할 수 있습니다. Object는 키 - 값 쌍 ("지도"라고도 부를 수 있음)과 프로토 타입입니다. 배열은 특별한 유형의 객체입니다. 특별한 프로토 타입 메소드 인 length 기능과 인덱스 - 값 쌍을 저장하는 다른 접근법 (인덱스가 여전히 키 임에도 불구하고)이 있습니다. 그래서 you shouldn't use an Array as an associative array.

var array = ["indexed with key 0", "indexed with key 1", ...]; 
var object = {"custom":"keyed as 'custom'", "another":"string", ...}; 
// but you still can add keys to array objects: 
array.custom = "keyed as 'custom'"; 
+0

+1 감사합니다. 이 기사는 엄청난 의미를가집니다. –

+0

...하지만 위쪽 화살표를 클릭하는 것을 잊었습니까? – Bergi

+0

답변을 upvote 15 rep의 점수가 필요합니다. 내가 할 수있을 때 돌아 오기 위해 나는 정신적으로 노트를 만들었다! –

관련 문제