JavaScript에서 JSON 찾기
JSON 에서 데이터를 찾기 위해 루핑하는 것보다 더 좋은 방법이 있습니까? 편집 및 삭제 용입니다.
for(var k in objJsonResp) {
if (objJsonResp[k].txtId == id) {
if (action == 'delete') {
objJsonResp.splice(k,1);
} else {
objJsonResp[k] = newVal;
}
break;
}
}
데이터는지도 목록으로 정렬됩니다. 처럼:
[
{id:value, pId:value, cId:value,...},
{id:value, pId:value, cId:value,...},
...
]
( "JSON"을 통해 검색하는 것이 아니라 배열을 통해 검색하는 것입니다. JSON 문자열은 이미 객체 그래프 (이 경우 배열)로 역 직렬화되었습니다.)
몇 가지 옵션 :
배열 대신 개체 사용
이 물건의 발생의 제어에 있다면, 그것은 않는 이 배열로? 그렇지 않다면 훨씬 더 간단한 방법이 있기 때문입니다.
이것이 원래 데이터라고 가정하십시오.
[
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]
대신 다음을 수행 할 수 있습니까?
{
"one": {"pId": "foo1", "cId": "bar1"},
"two": {"pId": "foo2", "cId": "bar2"},
"three": {"pId": "foo3", "cId": "bar3"}
}
그런 다음 ID로 관련 항목을 찾는 것은 간단합니다.
id = "one"; // Or whatever
var entry = objJsonResp[id];
... 업데이트 :
objJsonResp[id] = /* New value */;
... 제거 :
delete objJsonResp[id];
이것은 JavaScript에서 속성 이름을 문자열로 사용하여 객체에 색인을 생성 할 수 있다는 사실을 활용합니다.이 문자열은 리터럴이 될 수 있거나 id
위와 같이 변수에서 올 수 있습니다 .
ID- 색인지도에 넣기
(멍청한 생각, 위의 것보다 앞서. 역사적 이유로 유지됨.)
이 배열이 필요한 것 같습니다.이 경우 배열을 검색하는 것보다 더 좋은 방법은 없습니다. 맵을 배치하고 싶지 않으면 배열 생성을 제어 할 수 있습니다. 목적. 예를 들어, 원래 다음이 있다고 가정합니다.
[
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]
생성 코드는 id-to-index 맵을 제공 할 수 있습니다.
{
"index": {
"one": 0, "two": 1, "three": 2
},
"data": [
{"id": "one", "pId": "foo1", "cId": "bar1"},
{"id": "two", "pId": "foo2", "cId": "bar2"},
{"id": "three", "pId": "foo3", "cId": "bar3"}
]
}
그런 다음 변수에서 ID에 대한 항목을 얻는 id
것은 간단합니다.
var index = objJsonResp.index[id];
var obj = objJsonResp.data[index];
이것은 속성 이름을 사용하여 객체로 인덱싱 할 수 있다는 사실을 활용합니다.
물론 그렇게하면 배열을 수정할 때 맵을 업데이트해야하므로 유지 관리 문제가 될 수 있습니다.
그러나 객체 생성을 제어하지 않거나 ids-to-indexes 맵을 업데이트하는 것이 너무 많은 코드 및 / ora 유지 관리 문제인 경우 무차별 검색을 수행해야합니다.
무차별 대입 검색 (수정 됨)
다소 OT ( 더 나은 방법 이 있는지 묻지 만 :-)), 배열을 반복하는 코드가 올바르지 않습니다. 자세한 내용은 여기 에 있지만 for..in
배열 인덱스를 반복 하는 데 사용할 수 없습니다 (또는 그렇게하려면 특별한 수고를해야합니다). 배열 의 인덱스가 아닌 객체for..in
의 속성을 반복합니다 . 희소하지 않은 배열 (그리고 희소하지 않은 배열)에 대한 최선의 방법은 표준 구식 루프입니다.
var k;
for (k = 0; k < someArray.length; ++k) { /* ... */ }
또는
var k;
for (k = someArray.length - 1; k >= 0; --k) { /* ... */ }
어느 쪽을 선호하든 (후자는 모든 구현에서 항상 빠르지는 않지만 직관적이지 않지만 거기에 있습니다). ( 희소 배열을 사용하면 for..in
함정을 피하기 위해 특별한 고통을 겪을 수 있습니다 .
for..in
배열에 대한 사용 은 배열 에 각 인덱스에 대한 속성이 있고 다른 기본 속성 ( 및 해당 메서드) 만 열거 불가능으로 표시 되기 때문에 간단한 경우에 작동 하는 것처럼 보입니다length
. 그러나 배열 객체에 다른 속성을 설정 (또는 프레임 워크 설정)하자마자 중단됩니다 (완벽하게 유효합니다. 배열은 length
속성 주위에 약간의 특수 처리가있는 객체 일뿐입니다 ).
여러 중첩 된 개체가있는 복잡한 모델에 대해이 문제가 발생했습니다. 제가보고있는 작업의 좋은 예는 다음과 같습니다. 자신의 폴라로이드를 가지고 있다고 가정 해 보겠습니다. 그리고 그 사진은 차 트렁크에 넣습니다. 차는 큰 상자 안에 있습니다. 상자는 다른 많은 상자가있는 대형 선박의 화물칸에 있습니다. 나는 화물칸을 수색하고, 상자를 살펴보고, 트렁크를 확인한 다음 기존 내 사진을 찾아야했습니다.
온라인에서 사용할 좋은 솔루션을 찾을 수 없었 .filter()
으며 어레이에서만 작동합니다. 대부분의 솔루션은 model["yourpicture"]
존재 여부 만 확인하는 것이 좋습니다 . 이것은 매우 바람직하지 않은데, 그 예에서 배의 화물칸 만 수색 할 뿐이고 토끼 굴 아래로 더 멀리 내려갈 수있는 방법이 필요했기 때문입니다.
이것은 내가 만든 재귀 솔루션입니다. 의견에서 TJ Crowder에서 재귀 버전이 필요하다는 것을 확인했습니다. 누군가 비슷한 복잡한 상황을 만나면 공유하겠다고 생각했습니다.
function ContainsKeyValue( obj, key, value ){
if( obj[key] === value ) return true;
for( all in obj )
{
if( obj[all] != null && obj[all][key] === value ){
return true;
}
if( typeof obj[all] == "object" && obj[all]!= null ){
var found = ContainsKeyValue( obj[all], key, value );
if( found == true ) return true;
}
}
return false;
}
이것은 그래프 내부의 주어진 개체에서 시작하여 발견 된 모든 개체를 반복합니다. 다음과 같이 사용합니다.
var liveData = [];
for( var items in viewmodel.Crates )
{
if( ContainsKeyValue( viewmodel.Crates[items], "PictureId", 6 ) === true )
{
liveData.push( viewmodel.Crates[items] );
}
}
내 사진이 들어있는 상자 배열을 생성합니다.
Zapping-이 javascript lib를 사용할 수 있습니다. DefiantJS. 검색을 쉽게하기 위해 JSON 데이터를 개체로 재구성 할 필요가 없습니다. 대신 다음과 같은 XPath 표현식을 사용하여 JSON 구조를 검색 할 수 있습니다.
var data = [
{
"id": "one",
"pId": "foo1",
"cId": "bar1"
},
{
"id": "two",
"pId": "foo2",
"cId": "bar2"
},
{
"id": "three",
"pId": "foo3",
"cId": "bar3"
}
],
res = JSON.search( data, '//*[id="one"]' );
console.log( res[0].cId );
// 'bar1'
DefiantJS는 새로운 메소드로 전역 객체 JSON을 확장합니다. "검색"은 일치하는 배열을 반환합니다 (찾을 수없는 경우 빈 배열). 여기에 JSON 데이터를 붙여넣고 다양한 XPath 쿼리를 테스트하여 직접 시도해 볼 수 있습니다.
http://www.defiantjs.com/#xpath_evaluator
XPath is, as you know, a standardised query language.
If the JSON data in your array is sorted in some way, there are a variety of searches you could implement. However, if you're not dealing with a lot of data then you're probably going to be fine with an O(n) operation here (as you have). Anything else would probably be overkill.
If you are doing this in more than one place in your application it would make sense to use a client-side JSON database because creating custom search functions is messy and less maintainable than the alternative.
Check out ForerunnerDB which provides you with a very powerful client-side JSON database system and includes a very simple query language to help you do exactly what you are looking for:
// Create a new instance of ForerunnerDB and then ask for a database
var fdb = new ForerunnerDB(),
db = fdb.db('myTestDatabase'),
coll;
// Create our new collection (like a MySQL table) and change the default
// primary key from "_id" to "id"
coll = db.collection('myCollection', {primaryKey: 'id'});
// Insert our records into the collection
coll.insert([
{"name":"my Name","id":12,"type":"car owner"},
{"name":"my Name2","id":13,"type":"car owner2"},
{"name":"my Name4","id":14,"type":"car owner3"},
{"name":"my Name4","id":15,"type":"car owner5"}
]);
// Search the collection for the string "my nam" as a case insensitive
// regular expression - this search will match all records because every
// name field has the text "my Nam" in it
var searchResultArray = coll.find({
name: /my nam/i
});
console.log(searchResultArray);
/* Outputs
[
{"name":"my Name","id":12,"type":"car owner"},
{"name":"my Name2","id":13,"type":"car owner2"},
{"name":"my Name4","id":14,"type":"car owner3"},
{"name":"my Name4","id":15,"type":"car owner5"}
]
*/
Disclaimer: I am the developer of ForerunnerDB.
참고URL : https://stackoverflow.com/questions/1946165/json-find-in-javascript
'program story' 카테고리의 다른 글
NSDate 개체에서 UTC 시간 및 현지 시간 가져 오기 (0) | 2020.12.06 |
---|---|
Swift는 프로그래밍 방식으로 다른 뷰 컨트롤러 / 장면으로 이동합니다. (0) | 2020.12.06 |
내 Mac에서 Python easy_install이 작동하지 않는 이유는 무엇입니까? (0) | 2020.12.06 |
내용을 감싸지 않는 이미지보기 (0) | 2020.12.06 |
R 테이블에 해당하는 파이썬 (0) | 2020.12.06 |