web-dev-qa-db-ja.com

javascriptはネストされたオブジェクト/配列の深い値で検索します

hello、関数でオブジェクトを返すときに問題が発生しました。オブジェクトがあるとしましょう。

var elements = [{
    "fields": null,
    "id_base": "nv_container",
    "icon": "layout",
    "name": "container",
    "is_container": true,
    "elements" : [
        //another elements set here
    ]
}, 
{
    "id_base": "novo_example_elementsec",
    "name": "hello",
    "icon": "edit",
    "view": {}
}];

特定のキーと値を持つオブジェクトを見つけることができる関数(純粋なJavaScript)が欲しいのですが、関数を作成しましたが、うまく機能しませんか? 、私の機能:

function findNested(obj, key, value) {
    //Early return
    if (obj[key] === value) {
        console.log( 'before return' ); //until here . its fine
        return obj; //not working
    } else {
        for (var i = 0, len = Object.keys(obj).length; i <= len; i++) {
            if (typeof obj[i] == 'object') {
                this.findNested(obj[i] , key, value);
            }
        }
    }
}

私が間違ったことを確認できませんか?

ありがとう。

7
Omar Badran

再帰呼び出しを行った後、戻りがありません。再帰後にオブジェクトが見つかった場合は、その結果を(返すことによって)泡立たせる必要があります。 @ scott-marcusで指摘されているように、i < leni <= lenではなく)も使用する必要があります。

var elements = [{
    "fields": null,
    "id_base": "nv_container",
    "icon": "layout",
    "name": "container",
    "is_container": true,
    "elements": [
      //another elements set here
    ]
  },
  {
    "id_base": "novo_example_elementsec",
    "name": "hello",
    "icon": "edit",
    "view": {}
  }
];

function findNested(obj, key, value) {
  // Base case
  if (obj[key] === value) {
    return obj;
  } else {
    for (var i = 0, len = Object.keys(obj).length; i < len; i++) {
      if (typeof obj[i] == 'object') {
        var found = this.findNested(obj[i], key, value);
        if (found) {
          // If the object was found in the recursive call, bubble it up.
          return found;
        }
      }
    }
  }
}

console.log(findNested(elements, "icon", "layout")); // returns object
console.log(findNested(elements, "icon", "edit")); // returns object
console.log(findNested(elements, "foo", "bar")); // returns undefined
7
user94559