89

オブジェクトがあるとしましょう:

[
    {
        'title': "some title"
        'channel_id':'123we'
        'options': [
                    {
                'channel_id':'abc'
                'image':'http://asdasd.com/all-inclusive-block-img.jpg'
                'title':'All-Inclusive'
                'options':[
                    {
                        'channel_id':'dsa2'
                        'title':'Some Recommends'
                        'options':[
                            {
                                'image':'http://www.asdasd.com'                                 'title':'Sandals'
                                'id':'1'
                                'content':{
                                     ...

ID が 1 のオブジェクトを 1 つ見つけたいのですが、このような関数はありますか? Underscore の_.filter方法を使用することもできますが、一番上から始めて下にフィルターをかける必要があります。

4

21 に答える 21

95

再帰はあなたの友達です。プロパティ配列を考慮して関数を更新しました。

function getObject(theObject) {
    var result = null;
    if(theObject instanceof Array) {
        for(var i = 0; i < theObject.length; i++) {
            result = getObject(theObject[i]);
            if (result) {
                break;
            }   
        }
    }
    else
    {
        for(var prop in theObject) {
            console.log(prop + ': ' + theObject[prop]);
            if(prop == 'id') {
                if(theObject[prop] == 1) {
                    return theObject;
                }
            }
            if(theObject[prop] instanceof Object || theObject[prop] instanceof Array) {
                result = getObject(theObject[prop]);
                if (result) {
                    break;
                }
            } 
        }
    }
    return result;
}

更新された jsFiddle: http://jsfiddle.net/FM3qu/7/

于 2013-03-20T13:02:47.323 に答える
22

オブジェクトの検索中に ID が 1 の最初の要素を取得する場合は、次の関数を使用できます。

function customFilter(object){
    if(object.hasOwnProperty('id') && object["id"] == 1)
        return object;

    for(var i=0; i<Object.keys(object).length; i++){
        if(typeof object[Object.keys(object)[i]] == "object"){
            var o = customFilter(object[Object.keys(object)[i]]);
            if(o != null)
                return o;
        }
    }

    return null;
}

ID が 1 のすべての要素を取得する場合は、(ID が 1 のすべての要素が結果に格納されます):

function customFilter(object, result){
    if(object.hasOwnProperty('id') && object.id == 1)
        result.push(object);

    for(var i=0; i<Object.keys(object).length; i++){
        if(typeof object[Object.keys(object)[i]] == "object"){
            customFilter(object[Object.keys(object)[i]], result);
        }
    }
}
于 2013-03-20T12:34:47.863 に答える
1

少し前に、ネストされたオブジェクトをロダッシュの方法で操作するために、npmfind-andで利用できる小さな lib を作成しました。見つかったオブジェクト、または複数のオブジェクトが見つかった場合はオブジェクト配列を返す関数があります。returnFound

例えば、

const findAnd = require('find-and');

const a = [
  {
    'title': "some title",
    'channel_id':'123we',
    'options': [
      {
        'channel_id':'abc',
        'image':'http://asdasd.com/all-inclusive-block-img.jpg',
        'title':'All-Inclusive',
        'options':[
          {
            'channel_id':'dsa2',
            'title':'Some Recommends',
            'options':[
              {
                'image':'http://www.asdasd.com',
                'title':'Sandals',
                'id':'1',
                'content':{},
              },
            ],
          },
        ],
      },
    ],
  },
];

findAnd.returnFound(a, {id: '1'});

戻り値

{
  'image':'http://www.asdasd.com',
  'title':'Sandals',
  'id':'1',
  'content':{},
}
于 2020-01-29T13:03:10.030 に答える
-1

このコードにより、キーがユーザー定義の JSON 内のすべてのオブジェクトを取得できます。

function main(obj = {}, property){
 const views = [];

 function traverse(o) {
    for (var i in o) {
      if(i === property) views.push(o[i]);
      if (!!o[i] && typeof(o[i])=="object") {
        console.log(i, o[i]);
        traverse(o[i]);
      } else {
        console.log(i, o[i]);
      }
    }
    }

  traverse(obj);
  return views;

}



次に例を示します。

const obj = {
    id: 'id at level 1',
    level2: {
      id: 'id at level 2',
      level3: {
        id: 'id at level 3',
        level4: {
          level5: {
            id: 'id at level 5'
          }
       }
    }
  },
  text: ''
}

main(obj, 'id');

于 2020-05-06T13:19:14.350 に答える
-17

すでにアンダースコアを使用している場合は、_.find() を使用してください

_.find(yourList, function (item) {
    return item.id === 1;
});
于 2013-03-20T12:41:13.623 に答える