2017-10-04 12 views
1

중첩 배열을 사용하여 복잡한 데이터 구조를 갖고 있으며 대소 문자를 구분하지 않는 검색을 사용하여 문자열 값이있는 요소를 찾아야합니다.lodash : 대소 문자를 구분하지 않는 방법 _.find()

중첩 된 쿼리를 수행하는 간단한 구문 때문에 lodash를 사용하기 시작했습니다. 대단위지만 검색은 대소 문자를 구분합니다.

"type"값이 'route'이고 "long_name"값이 'targetStreet'인 매개 변수와 동일한 'address_components'요소를 찾고 싶습니다. 여기

내가 지금까지 가지고있는 lodash 코드 :

var result = _.find(geocodeResult, 
     { 
      'address_components': [ 
       { 
        types: ['route'], 
        'long_name': targetStreet 
       } 
      ] 
     }); 

질문 : 가 어떻게이 "긴 이름"속성 케이스의 일치가 문자를 구분 할 수 있습니까?

다음은 'geocodeResult'데이터 구조 (실제로는 Google 지오 코딩 결과 개체)의 예입니다.

이 데이터 구조는 동적입니다 ... Google은 가능한 가장 구체적인 결과를 반환하지만 거리와 일치하는 항목을 찾을 수없는 경우 거리 구성 요소를 반환하지 않습니다. 예 : "address_components"내의 "types"배열에는 비 결정적 값이 있습니다.

[ 
    { 
    "address_components": [ 
     { 
     "long_name": "V&a Lane", 
     "short_name": "V&a Ln", 
     "types": [ 
      "route" 
     ] 
     }, 
     { 
     "long_name": "Coonawarra", 
     "short_name": "Coonawarra", 
     "types": [ 
      "locality", 
      "political" 
     ] 
     }, 
     { 
     "long_name": "Wattle Range Council", 
     "short_name": "Wattle Range", 
     "types": [ 
      "administrative_area_level_2", 
      "political" 
     ] 
     }, 
     { 
     "long_name": "South Australia", 
     "short_name": "SA", 
     "types": [ 
      "administrative_area_level_1", 
      "political" 
     ] 
     }, 
     { 
     "long_name": "Australia", 
     "short_name": "AU", 
     "types": [ 
      "country", 
      "political" 
     ] 
     }, 
     { 
     "long_name": "5263", 
     "short_name": "5263", 
     "types": [ 
      "postal_code" 
     ] 
     } 
    ], 
    "formatted_address": "V&a Ln, Coonawarra SA 5263, Australia", 
    "geometry": { 
     "bounds": { 
     "south": -37.3238134, 
     "west": 140.8154452, 
     "north": -37.3228868, 
     "east": 140.97295129999998 
     }, 
     "location": { 
     "lat": -37.3233904, 
     "lng": 140.89510410000003 
     }, 
     "location_type": "GEOMETRIC_CENTER", 
     "viewport": { 
     "south": -37.3246990802915, 
     "west": 140.8154452, 
     "north": -37.3220011197085, 
     "east": 140.97295129999998 
     } 
    }, 
    "partial_match": true, 
    "place_id": "EiVWJmEgTG4sIENvb25hd2FycmEgU0EgNTI2MywgQXVzdHJhbGlh", 
    "types": [ 
     "route" 
    ] 
    }, 
    { 
    "address_components": [ 
     { 
     "long_name": "V&a Lane", 
     "short_name": "V&a Ln", 
     "types": [ 
      "route" 
     ] 
     }, 
     { 
     "long_name": "Coonawarra", 
     "short_name": "Coonawarra", 
     "types": [ 
      "locality", 
      "political" 
     ] 
     }, 
     { 
     "long_name": "Wattle Range Council", 
     "short_name": "Wattle Range", 
     "types": [ 
      "administrative_area_level_2", 
      "political" 
     ] 
     }, 
     { 
     "long_name": "South Australia", 
     "short_name": "SA", 
     "types": [ 
      "administrative_area_level_1", 
      "political" 
     ] 
     }, 
     { 
     "long_name": "Australia", 
     "short_name": "AU", 
     "types": [ 
      "country", 
      "political" 
     ] 
     }, 
     { 
     "long_name": "5263", 
     "short_name": "5263", 
     "types": [ 
      "postal_code" 
     ] 
     } 
    ], 
    "formatted_address": "V&a Ln, Coonawarra SA 5263, Australia", 
    "geometry": { 
     "bounds": { 
     "south": -37.3238134, 
     "west": 140.8154452, 
     "north": -37.3228868, 
     "east": 140.97295129999998 
     }, 
     "location": { 
     "lat": -37.3233904, 
     "lng": 140.89510410000003 
     }, 
     "location_type": "GEOMETRIC_CENTER", 
     "viewport": { 
     "south": -37.3246990802915, 
     "west": 140.8154452, 
     "north": -37.3220011197085, 
     "east": 140.97295129999998 
     } 
    }, 
    "partial_match": true, 
    "place_id": "EiVWJmEgTG4sIENvb25hd2FycmEgU0EgNTI2MywgQXVzdHJhbGlh", 
    "types": [ 
     "route" 
    ] 
    } 
] 

답변

1

당신이 lodash.find 사용하는 방법은 불행하게도 당신이 정규 표현식을 통과하거나 개체 속성에 영향을받지 검색을 얻기 위해 작동하지 않을 수 lodash.match 속기 (https://lodash.com/docs/4.17.4#find)에 해당합니다.

당신은 (소문자로 targetStreet 가정) 검색을 수행하기 위해 그런 일을 작성해야합니다 :

var result = _.find(geoCodeResult, function (result) { 
    return _.find(result.address_components, function(component) { 
     return _.includes(component.types, 'route') 
     && component.long_name.toLowerCase() === targetStreet; 
    }); 
}); 

당신은 또한 사용 lodash없이 쓸 수를 ES6 구문 + Array.prototype.findArray.prototype.includes (최근 브라우저 용)

const result = geoCodeResult.find(result => 
    result.address_components.find(({ types, long_name }) => 
     types.includes('route') && long_name.toLowerCase() === targetStreet 
    )); 
2

비교하기 전에 두 값을 같은 대소 문자로 변환하십시오.

var search = 'Australia'.toLowerCase(); 

var result = _.find(geoCodeResult, function (location) { 
    return location.long_name.toLowerCase() === search; 
}); 
+0

주어진 데이터 구조에서는 작동하지 않습니다. 함수는 컬렉션의 모든 객체에 대해 한 번 실행됩니다. 나의 예에서는 두 가지가있다. 이러한 객체에는 차례로 6 개의 속성이 있습니다. 내가 관심을 갖고있는 유일한 객체는 "address_components"입니다. 그리고 그 안에 ... "경로"값을 가진 "types"배열이 있는지 확인해야합니다 (거기에 없을 수도 있습니다) ... 그렇다면 "long_name"속성을 확인해야합니다. .. 네가 중첩 권리를 얻어야하고 우리가 그곳에있는 특성에 의지 할 수는 없다. – JTech

+0

충분합니다. 대문자 소문자를 구별하는 방법 _find()'에 대한 질문에 대답하고있었습니다. – fubar