2010-12-13 6 views
2

저는 새로운 JavaScript이고 객체 리터럴로부터 주어진 값을 쉽게 찾을 수있는 방법을 찾으려고합니다.자바 스크립트에서 주어진 값, 객체 리터럴에서 이름 찾기

var cars ={ Toyata: ['Camry','Prius','Highlander'], 
      Honda: ['Accord', 'Civic', 'Pilot'], 
      Nissan: ['Altima', 'Sentra', 'Quest']}; 

주어진 'Accord', 나는 자동차에서 혼다를 얻고 싶다.

+0

다른 제조업체의 모델이 같은 경우 어떻게됩니까? 시보레가 협정을 체결했다고 가정 해 봅시다. –

+1

"쉬운 방법"보다 무엇? 지금 어떻게하고 있는지 게시하지 않으시겠습니까? 그런데 도움이 될만한 라이브러리를 사용할 수 없다면 더 쉬운 방법은 없을 것입니다. –

답변

3

당신은 다음과 같이 통해 루프 필요 : IE는 가지고 있지 않기 때문에 크로스 브라우저 작업의 동일한에 대한

You can test it out here

function getManufacturer(carName) { 
    for(var key in cars) { 
     if(cars.hasOwnProperty(key)) { 
      for(var i=0; i<cars[key].length; i++) { 
       if(cars[key][i] == carName) return key; 
      } 
     } 
    } 
    return "Not found"; 
} 
는이 that version would look like this ... .indexOf()의 존재를 무시합니다 :

function getManufacturer(carName) { 
    for(var key in cars) { 
     if(cars.hasOwnProperty(key) && cars[key].indexOf(carName) != -1) { 
      return key; 
     } 
    } 
    return "Not found"; 
} 
+0

그냥 호기심 ... cars.hasOwnProperty 중복인가요? –

+0

@SB - 아니요. 누군가가 Object 프로토 타입을 엉망으로 만든다면 ... 안전하지 않은 것이 좋습니다. IMO –

+0

@SB :이 시점에서 주로화물 컬트 프로그래밍입니다. 이론은 그것을하는 것이 안전하지만 반드시 그것을하지 않는 것이 안전 할 수는 없다는 것입니다. 가능한 안전하지 않은 이유에 대한 내 대답에 대한 각주를 참조하십시오. 힌트 : hasOwnProperty는 속성이 상속되었는지 여부를 알려줍니다. – slebetman

1

이 작업을 한 번 수행하려는 경우 바비가 제공 한 것과 같은 기능을 사용하십시오. 주어진 아무것도 상속하지 않는 객체의 경우 : 가려운 downvoting 손가락에 그들을위한

var manufacturers = {}; 

// create a map of car models to manufacturers: 
for (var manf in cars) { 
    /* see note below */ 

    for (var i=0; i<cars[manf].length; i++) { 
     manufacturers[cars[manf][i]] = manf; 
    } 
} 

// Now referencing the manufacturers is 
// a very fast hash table lookup away: 

var model = 'Accord'; 
alert(manufacturers[model]); 

참고 :이 여러 번 일을 할 거라면 그때 제조업체 자동차의 역 매핑을 만드는 게 좋을 것 OP에서 hasOwnProperty 확인은 필요 없습니다. 상속받은 객체의 경우 프로그래머에 따라 다릅니다. 상속을 통해 합성 가능성을 원한다면, hasOwnProperty 검사는 정확히 당신이 원하는 것입니다. 상속에 대해 신경 쓰지 않는다면 hasOwnProperty 검사를 사용하십시오. 그렇다면 먼저 hasOwnProperty 검사를 필요로하지 않는 상속을받지 않을 것입니다. 드물게 상속을 통해 객체를 생성해야하지만 부모의 속성을 확인하지 않으려면 hasOwnProperty 검사를 수행해야합니다. 물론 Object 객체 수정을 주장하는 Prototype.js와 같은 라이브러리를 사용하는 경우 hasOwnProperty 검사를해야하기 때문에 미안하다고 생각합니다.

+0

이것은 동일한 결과를 가지지 않을 것입니다. 2 개의 제조업체가 동일한 자동차를 만들었다면이 것이 * last * * first *보다는 오히려 두 위치 모두 객체 속성 순서와 관련이 있습니다 ... 이는 보장되지 않습니다. –

+0

@Nick : 아, 그렇지만 우리가 여기서 자동차에 대해 이야기하고 있다면 모델 이름이 고유 할 가능성이 높습니다. 마찬가지로, 다른 문제 도메인도이 속성을 가질 수 있습니다. 게다가, 객체 속성은 무작위 순서 (적어도 이론적으로는)를 가지고 있으므로 제조자 이름을 먼저 분류하지 않으면 "first"또는 "last"에 대해 이야기하는 것이 의미가 없습니다. (파이어 폭스에서 적어도 for..in 루프를 수행 할 때 반드시 객체 속성이 생성 순서로 올라와 있지는 않습니다. PHP가 아닙니다.) – slebetman

-1

제조업체와 모델을 별도로 매핑하십시오.

var cars ={ Toyata: ['Camry','Prius','Highlander'], 
      Honda: ['Accord', 'Civic', 'Pilot'], 
      Nissan: ['Altima', 'Sentra', 'Quest']}; 

var models = {}; 
var hasOwnProperty = Object.prototype.hasOwnProperty; 
for (key in cars) { 
    if (hasOwnProperty.call(cars, key)) { 
     var i=0,l=cars[key].length,manufacturer=cars[key]; 
     while (i<l) { 
      if (! hasOwnProperty.call(models, manufacturer)) { 
       models[manufacturer] = key; 
      } else { 
       // Throw an error, or change the value to an array of values 
      } 
      i++; 
     } 
    } 
} 
+0

기타 코드 : 예! 키와 값의 쌍방향 매핑을 가능하게하는 하나의 데이터 구조가 필요합니다. –

+0

@George - 이해하지 못해서 용서해주세요 ... 왜 데이터 구조 접근 방식을 제안합니까? 나는이 경우에 그것이 어떻게 더 좋을지를 보지 못한다. (재사용 가능성 때문이라고 생각합니다.) –

+0

예, 다시 사용할 수 있습니다. 원본 데이터 구조와 사용자가 제안한 객체를 캡슐화하는 사용자 정의 객체 일 수 있습니다. 그러나 분명히 두 가지를 연관시키는 어떤 방식으로 그들은 서로 관계가없는 범 세계적인 영역에 있지 않습니다. –

관련 문제