>

첫 번째 수준 키를 몰라도 조건을 충족하는 중첩 된 개체의 모든 2 단계 수준 요소에 액세스하고 싶습니다.

예 :

myObject = {
   foo: {
      element_one : 1,
      element_two : 1,
      ...
   },
   bar: {
      element_one : 3,
      element_two : 4,
      ...
   },
   buzz: {
      element_one : 99,
      element_two : 100,
      ...
   },
   ...
}

위의 예에서 나는 myObject.<any_key>.element_one === some_number 가있는 모든 1 레벨 키를 효율적으로 잡을 수 있기를 원했습니다. .

한 가지 확실한 해결책은 목록을 반복하고 각 요소를 확인하는 것이지만이 함수를 여러 번 호출하면 계산 비용이 많이 듭니다. 백업으로 키 = element_one 인 새 객체를 만들어 참조로 사용할 수 있습니다.

그러나 이것을 처리하는 더 좋은 방법이 있는지 궁금합니다.

수정 : 요소의 최대 값에 대한 사전 지식이 없습니다.


  • 답변 # 1

    작동하는 것 :

    var obj = <YOUR_OBJ>
    var final_keys = [];
    for(key in obj)
    {
     if(a[key].element_one == 1){
       final_keys.push(key);
     }
    }
    console.log(final_keys);
    
    

  • 답변 # 2

    Object.keys 를 사용할 수 있습니다  객체의 첫 번째 레벨 키 배열을 가져 와서 Array.prototype.filter 를 사용하십시오.  첫 번째 레벨 키를 필터링하려면 두 번째 레벨 키에 지정된 번호가 있습니다 :

    myObject = {
       foo: {
          element_one : 1,
          element_two : 1
          },
       bar: {
          element_one : 3,
          element_two : 4
         },
       buzz: {
          element_one : 99,
          element_two : 100
       }
       
    } 
    console.log(Object.keys(myObject).filter(key => myObject[key].element_one === 99));
    
    

  • 답변 # 3

    그래서 두 가지 솔루션을 제공 할 것입니다.

    1)일치하는 키 배열

    2)일치하는 키 (및 관련 값)가 포함 된

    const myObject = {
       foo: {
          element_one : 1,
          element_two : 1,
       },
       bar: {
          element_one : 3,
          element_two : 4,
       },
       dogs: {
          element_one : 1,
          element_two : 4,
       },
       buzz: {
          element_one : 1,
          element_two : 100,
       },
    }
    const matchingKeys = Object.keys(myObject).filter(key => {
    	return myObject[key].element_one === 1
    })
    // 1st solution: if you want the matching keys only
    console.log(matchingKeys)
    const objectWithMatchingKeys = Object.keys(myObject).reduce((acc, val) => {
      if (myObject[val].element_one === 1) acc[val] = myObject[val]
      return acc
    }, {})
    // 2nd solution: if you want the object WITH matching keys
    console.log(objectWithMatchingKeys)
    
    

    도우미 기능에서 함수 매개 변수로 하드 코딩 된 키 (예 : element_one)를 교체하여 위의 솔루션을 확장 가능/재사용 가능하게 만들 수 있습니다!

  • 답변 # 4

    응답 해 주셔서 감사합니다. 요소의 최소/최대 값에 대한 통제력이나 지식이 없다고 생각하고 그것들이 반드시 순서대로있는 것은 아닙니다. Bergi와 RK_oo7의 의견은 정확합니다. 가장 효율적인 솔루션은 목록을 한 번 반복하고 미래의 요소 값을 캐시하는 것입니다.

    이것과 같은 것 :

    var elementIndex = {};
    Object.entries(myObject).forEach(([key, val]) => {
      if (val.element_one in elementIndex) {
         elementIndex[val.element_one].push(key);
      } else {
         elementIndex[val.element_one] = [key];
      }
    });
    
    

  • 이전 algorithm - 동적 문제 질문에서 겹치는 하위 문제 (코인 변경 문제)
  • 다음 php - 데스크톱 및 모바일 기기에서 href에서 전화 번호를 가져 와서 변환