2010-11-30 9 views
61

만약 내가 같은 객체 :는 자바 스크립트 객체의 마지막 항목을 받고

{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' } 

나는 목록은 개체를 통해 루핑보다, 'C'까지 다른가는 것을 미리 알 수없는 경우, 객체의 마지막 항목을 가져 오는 방법이 있습니까 (예 : 'carrot')?

+0

. 또한, 객체를 루핑하는 것 이외의 방법으로 객체를 빈 상태로 검사 할 수 있습니까? –

+1

** 속성 ** "항목"이 아닙니다. 아니요, 속성 순서는 정의되지 않았습니다. –

+0

마지막 속성 * 값 * 그가 의미하는 바에는 – KooiInc

답변

52

아니요. 주문은 JSON 및 기타 대부분의 키 - 값 데이터 구조에서 보장되지 않으므로 마지막 항목은 carrot이고 다른 경우는 banana이 될 수 있습니다. 에 주문하는 데 의존하는이 필요한 경우 가장 좋은 방법은 배열을 사용하는 것입니다. 키 - 값 데이터 구조의 힘은 객체의 nth 항목을 가져올 수있는 것이 아니라 keys으로 값에 액세스하는 데 있습니다.

+1

이 전체적으로 정답을 확장 한 것입니다. 배열 마커'[]'를 사용하여 JS에서 연관 배열을 만드는 경우에도 객체는 배열이 아닙니다. 실제로는 객체입니다. JS에는 연관 배열이 없으므로 배열에는 액세스 및 시퀀스가 ​​인덱싱됩니다. 객체에는 비 순차적 인 연관 속성 액세스가 있습니다. – Orbling

+1

나는 그들이 주문한 것을 보장받지 못한다는 것을 알고 있지만, 내가 물건의 창조물에 대한 통제권을 가지고 있다면, 실질적인 관점에서 볼 때, 나는 그들이 특정한 순서에 부합하는지 확인할 수있다. 분명히 질문에 대한 대답은 "아니오"입니다. :) – sprugman

+1

@sprugman : Chrome에는 없습니다. 오랜 논쟁이이 주제에 대해 격렬 해지고 있습니다. http://code.google.com/p/v8/issues/detail?id=164 –

5

주문이 중요한 경우 개체 리터럴이 아닌 배열을 사용하십시오. dict에 대한

list = ['apple', 'banana', 'carrot']; 

또는 뭔가 심지어

dict = { 
'a' : ['apple', 'awesome'], 
'b' : ['best friend'] 
}; 

또는

같은 ..

dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}]; 

키는 순서로 전혀 보장되지 않습니다. 자바 스크립트에서 개체 속성의 순서에 관해서는

+0

+1은 ABC 방송을 가르치는 다채로운 방법입니다. – paqogomez

5

, 나는이 답변에 링크 단지 것 : 특히

Elements order in a "for (… in …)" loop

: 인 ECMAScript의

모든 현대적인 구현은 반복 객체 속성을 통해 이 정의 된 순서대로

다른 모든 대답은 정확합니다. 객체 속성에 대한 공식 보장 된 명령은 없습니다. 그러나 실제에는 (자연적으로 정립 된 행동조차도 정식으로 고정시킬 수있는 버그는 없다.)

또한 개체 속성의 사실상 열거 순서는 향후 EMCAScript 사양에서 성문화 될 가능성이 높습니다.

아직이 시점에서 나는 객체 속성 순서를 다루는 데 도움이되는 내장 도구가 없기 때문에이 코드를 작성하지 않을 것입니다. 당신은 당신 자신의 것을 쓸 수는 있지만 결국에는 객체의 각 속성을 반복하여 그 위치를 결정할 것입니다.

질문에 대한 답변은 아니요이므로 객체를 반복하는 것 외에 다른 방법은 없습니다.

+0

당신이 말했듯이, 나는 분명히 객체 프로퍼티 열거를위한 순서에 의존하지 않을 것이다. 처음에는 새로운 ECMAScript 구현이 사실상의 표준을 따를 의무가 없으므로 특정 순서에 의존하는 코드는 미래를 보장하지 않습니다. 또한 모든 브라우저가 동일한 동작을하는 것은 아닙니다. Chrome 버그 추적기에 대한 다음 토론 (http://code.google.com/p/v8/issues/detail?id=164)을 참조하십시오. 마지막으로, ECMAScript 스펙이 곧 표준화 될 것으로 기대하지는 않습니다. –

12
var myObj = {a: 1, b: 2, c: 3}, lastProperty; 
for (lastProperty in myObj); 
lastProperty; 
//"c"; 

소스 : http://javascriptweblog.wordpress.com

+2

"객체를 통해 루핑하는 것 외" – sprugman

+1

객체의 첫 번째 키를 가져와야하는 경우 위의 방법을 따를 수 있지만 다음과 같이 할 수 있습니다. for (firstProperty in myObj) {break; };' – panosru

136

예, Object.keys(obj)를 사용하는 방법이있다.this page에 설명되어 있습니다 : 마지막 개체의 값을 얻고 싶다면

var fruitObject = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }; 
Object.keys(fruitObject); // this returns all properties in an array ["a", "b", "c"] 

, 당신은이 작업을 수행 할 수 있습니다 :

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot" 
+5

이것은 Object.keys가 훌륭하게 작동한다는 것을 받아 들여야 만합니다. IE8과 7에서 작동하도록 만드는 방법을 찾아야합니다. IE9에서만 나타 났기 때문입니다. – RaphaelDDL

+0

날짜별로 _.groupBy 서버 측 (노드)으로 그룹화했습니다. 매력처럼 작동하면서 사람들이 주문에 대한 보장이 없다고 말하는 이유를 알지 못합니다. – BigDong

+0

고맙습니다. 좋은 답변입니다. –

11

마지막 = Object.keys (OBJ) Object.keys (obj). 길이 -1]; obj가 개체

+0

이것은 마지막 키 (이 경우 'c')를 얻지 만, 질문자가 마지막 값 (''당근 '')을 찾고 있음을 의미하는 방식으로 말을합니다. 이것은 또한 [Kristina Stefanova의 대답] (https://stackoverflow.com/a/16590272/399105)에서 이미 다루지 않은 것을 추가하지는 않습니다. – bmaupin

3
JSArray = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }; 
document.write(Object.keys(JSArray)[Object.keys(JSArray).length-1]);// writes 'c' 
document.write(JSArray[Object.keys(JSArray)[Object.keys(JSArray).length-1]]); // writes 'carrot' 
0

Map object in JavaScript 입니다

. 이것은 이미 약 3 년 전입니다. 이지도 데이터 구조는 항목이 삽입되는 순서를 유지합니다. 검색 중로 마지막 항목은 실제로 ES6의 destructuring 할당 구문을 사용하여

4

솔루션 맵에 삽입 된 최신 항목에서 발생합니다 :

var temp = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }; 
 
var { [Object.keys(temp).pop()]: lastItem } = temp; 
 
console.info(lastItem); //"carrot"
좋은 질문이다