web-dev-qa-db-ja.com

多次元JavaScript配列をフィルタリングする方法

私はこのデータを持っています:

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
    }}];

名前でフィルタリングしたいと思います。たとえば、「Fran」という名前にフィルターを適用する場合、次のようなものが必要です。

[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!
     )

達成することは可能ですか?

12
davidgmar

Javascriptにはこのための関数はありません。このように独自の関数を作成する必要があります。

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");
10
Diode
var result = [];
for (var i = 0; i < object.length; i++)
{
    if (object[i].name == 'Fran')
    {
        result.Push(object[i]);
    }
}
8
PiTheNumber

フィルタリング用の関数を作成します

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);
7
Richard A

大きな秘訣は、必要なアイテムだけを含むフラットな配列を作成することです。

次のような2D配列があるとします。

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

新しい配列を作成します。

var f = []

たった1つのアイテムでそれを埋めてください:

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

私たちに次のようなものを与えます:

f = [2,2,3,5,7]

その後....

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

カワブンガ!

0
user40521

私はDiodeのソリューションを試します。私は自分のケースに適応します。 3つのアレイが含まれています。

var arr = 
[

  {
    taskTypeGroupId: "EXP.CONT", taskTypeGroupName: "Contradictoire", 
    taskType: 
    {
      taskTypeId: "DGE-EXPCONT", taskTypeName: "Dégats des eaux contradictoire", defaultDuration: 60, isInProject: false, 
      dataItems:
      {
        id: "EXTRAFILLER5", label: "Divers 5"
      }
    }
  },

  {
  takTypeGroupId: "EXPQUAL", taskTypeGroupName: "Contrôle qualité", 
    taskType: 
    {
      taskTypeId: "DGE-EXPQUAL", taskTypeName: "Contrôle qualité dégats des eaux", defaultDuration: 60, isInProject: false, 
      dataItems: 
      {
        id: "EXTRAFILLER5", label: "Divers 5"
      }
    }
  }

];
function filterByProperty(array, prop, value){
var filtered = [];

for(var i = 0; i < array.length; i++){
var array1 = array[i];
  for(var key in array1){
    if(typeof(array1[key] == "object")){
    var array2 = array1[key];
      for (var key2 in array2){
        if(typeof(array2[key2] == "object")){
        var array3 = array2[key2];
          if(array3[prop] == value){
            filtered.Push(array3);
          }
        }
      }
    }
  }
}    
return filtered;

}

JsBinの例

0
T.Ban

オブジェクトにemail、firstName、lastNameなどの3つのフィールドが含まれている場合は、これを使用します。

ArrayObject
.filter(em => em.email.indexOf(searchEmail) > -1)
.filter(fn => fn.firstName.indexOf(searchFirstName) > -1)
.filter(ln => ln.lastName.indexOf(searchLastName) > -1) 
0
Satya Arya