2012-02-09 5 views
8

이것은 내 첫 번째 게시물입니다. 저는 오랫동안 솔루션을 찾고있었습니다.다차원 자바 스크립트 배열을 필터링하는 방법

그래서 나는이 JSON 데이터를 가지고 :

var object = [{ 
    "nid": "31", 
    "0": { 
     "tid": "20", 
     "name": "Bench Press", 
     "objectDate": "2012-02-08", 
     "goal": "rep", 
     "result": "55.00", 
     "comments": "sick!", 
     "maxload": "250" 
    }, 
    "1": { 
     "tid": "22", 
     "name": "Back Squat", 
     "objectDate": "2012-02-08", 
     "goal": "time", 
     "result": "8.00", 
     "comments": "i was tired.", 
     "maxload": "310" 
    }}, 
{ 
    "nid": "30", 
    "0": { 
     "tid": "19", 
     "name": "Fran", 
     "objectDate": "2012-02-07", 
     "goal": "time", 
     "result": "5.00", 
     "comments": null 
    }}]; 

을 그리고 이름을 필터링하고 싶습니다.

[0] => Array 
    (
     [tid] => 19 
     [name] => Fran 
     [objectDate] => 2012-02-07 
     [goal] => time 
     [result] => 5.00 
     [comments] => 
    ) 
[1] => Array 
    (
     [tid] => 19 
     [name] => Fran 
     [objectDate] => 2012-02-08 
     [goal] => rep 
     [result] => 55.00 
     [comments] => woohoo! 
    ) 

그것을 달성 할 수 있는가 : 나는 이름이 "프랜"에 대한 필터를 적용 할 경우 예를 들어, 나는 이런 식으로 뭔가를하고 싶습니다? 어떤 도움이라도 대단히 감사하겠습니다! >

+0

내 JSON.search API는 $ .grep보다 5 배 빠르고 정규 표현식을 사용하여 검색 할 수 있습니다. http://json.spiritway.co/ – mgwhitfield

답변

8

자바 스크립트에는이 기능이 없습니다. 이렇게 자신 만의 함수를 작성해야합니다.

var arr = [{"nid":"31","0":{"tid":"20","name":"Bench Press","objectDate":"2012-02-08","goal":"rep","result":"55.00","comments":"sick!","maxload":"250"},"1":{"tid":"22","name":"Back Squat","objectDate":"2012-02-08","goal":"time","result":"8.00","comments":"i was tired.","maxload":"310"}},{"nid":"30","0":{"tid":"19","name":"Fran","objectDate":"2012-02-07","goal":"time","result":"5.00","comments":null}}]; 


function filterByProperty(array, prop, value){ 
    var filtered = []; 
    for(var i = 0; i < array.length; i++){ 

     var obj = array[i]; 

     for(var key in obj){ 
      if(typeof(obj[key] == "object")){ 
       var item = obj[key]; 
       if(item[prop] == value){ 
        filtered.push(item); 
       } 
      } 
     } 

    }  

    return filtered; 

} 

var byName = filterByProperty(arr, "name", "Fran"); 
var byGoal = filterByProperty(arr, "goal", "time"); 
+0

감사합니다! 다른 레벨을 반복해야했지만 지금은 작동합니다. :) – davidgmar

5
var result = []; 
for (var i = 0; i < object.length; i++) 
{ 
    if (object[i].name == 'Fran') 
    { 
     result.push(object[i]); 
    } 
} 
5

를 필터링하는 기능을 만들 것이다 :

function filter(array, key, value){ 
    var i, j, hash = [], item; 

    for(i = 0, j = array.length; i<j; i++){ 
     item = array[i]; 
     if(typeof item[key] !== "undefined" && item[key] === value){ 
      hash.push(item); 
     } 
    } 

    return hash; 
} 

보다 강력한 해결책은 프로토 타입 필터 수단을 추가 할 수있다 :

`This prototype is provided by the Mozilla foundation and 
    is distributed under the MIT license. 
    http://www.ibiblio.org/pub/Linux/LICENSES/mit.license` 

if (!Array.prototype.filter) 
{ 
    Array.prototype.filter = function(fun /*, thisp*/) 
    { 
    var len = this.length; 
    if (typeof fun != "function") 
     throw new TypeError(); 

    var res = new Array(); 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) 
    { 
     if (i in this) 
     { 
     var val = this[i]; // in case fun mutates this 
     if (fun.call(thisp, val, i, this)) 
      res.push(val); 
     } 
    } 

    return res; 
    }; 
} 

그런 다음 간단히 전화하십시오 :

function filterName (item, index, array) { 
    return (item.name === "Fran"); 
} 

var result = object.filter(filterName); 
+1

+1 함수'filter'를 참조하십시오. – diEcho

0

큰 트릭은 원하는 항목만으로 평면 배열을 만드는 것입니다. 미를 부여

for(var x=0;x<e.length;x++) f[x] = e[x][1] 

:

var f = [] 

단지 1 개 항목으로 채우기 :

e = [[1,2],[1,2],[2,3],[4,5],[6,7]] 

가 새 배열을 만들 :

는 2 차원 배열과 같이이 있다고 좋아하는 것 :

하고 ....

var g = e.filter(function(elem, pos){ return (f.indexOf(elem[1]) == pos) }) 

코와 붕가!

관련 문제