いくつかのパラメータでJavaScriptツリー内のノードを検索します

vmamaev

アンダースコアのミックスインを書こうとしています。これは、いくつかのパラメータでノードを見つけることができます。次に例を示します。

_.findDeep(tree, {id: 5456, parent_id: 555})

木:

var tree = [
  {
    id: 22,
    name: 'qqqq',
    depth: 0,
    parent_id: 11,
    children: [
      {
        id: 222,
        name: 'ttttt',
        depth: 1,
        parent_id: 444,
        children: [],
        positions: []
      },
      {
        id: 5456,
        name: 'yyyy',
        depth: 1,
        parent_id: 555,
        children: [
          {
            id: 6767,
            name: 'dfgfdg',
            depth: 3,
            parent_id: 6564,
            children: [],
            positions: []
          },
          {
            id: 4345,
            name: 'dfgdgfg',
            depth: 3,
            parent_id: 45234,
            children: [],
            positions: []
          },
        ],
        positions: []
      },
    ],
    positions: [
      {
        id: 14,
        name: 'rere',
        price: 20
      },
      {
        id: 12,
        name: 'tttyty',
        price: 30
      },
    ]
  },
  {
    id: 33,
    name: 'wwww',
    depth: 0,
    parent_id: 22,
    children: [],
    positions: []
  },
  {
    id: 44,
    name: 'eeee',
    depth: 0,
    parent_id: 33,
    children: [],
    positions: []
  },
]

間違った関数。常に「undefined」を返しますが、console.logにファウンドノードが表示されます。

  _.mixin({
    findDeep: function(items, attrs) {
      var key, n_key, n_value, result, value;
      result = _.findWhere(items, attrs);
      console.log(items, result, _.isUndefined(result));
      if (_.isUndefined(result)) {
        for (key in items) {
          value = items[key];
          for (n_key in value) {
            n_value = value[n_key];
            if (_.isObject(n_value) || _.isArray(n_value)) {
              result = _.findDeep(n_value, attrs);
              if (!_.isUndefined(result)) {
                return result;
              }
            }
          }
        }
      }
      return result;
    }
  });

間違いはどこですか?私を助けてください

fuyushimoya

あなたのコードでは、

for (n_key in value) {
    n_value = value[n_key];
    if (_.isObject(n_value) || _.isArray(n_value)) {
       _.findDeep(n_value, attrs);
    }
}

は詳細検索を実行していますが、結果を返しません。結果を検索に割り当てる必要があります。結果がそうでない場合は、結果をundefined返すか、forループをすぐに中断してください。

したがって、次のようになります。

_.mixin({
  findDeep: function(items, attrs) {
    var key, n_key, n_value, result, value;
    result = _.findWhere(items, attrs);
    console.log(items, result, _.isUndefined(result));
    if (_.isUndefined(result)) {
      for (key in items) {
        value = items[key];
        for (n_key in value) {
          n_value = value[n_key];
          if (_.isObject(n_value) || _.isArray(n_value)) {
            result = _.findDeep(n_value, attrs);
          }

          // Once you find the result, you can return the founded result
          if (!_.isUndefined(result)) {
            return result;
          }

        }
      }
    }
    return result;
  }
});

正しい結果を表示するためのスニペット:

var tree = [
  {
    id: 22,
    name: 'qqqq',
    depth: 0,
    parent_id: 11,
    children: [
      {
        id: 222,
        name: 'ttttt',
        depth: 1,
        parent_id: 444,
        children: [],
        positions: []
      },
      {
        id: 5456,
        name: 'yyyy',
        depth: 1,
        parent_id: 555,
        children: [
          {
            id: 6767,
            name: 'dfgfdg',
            depth: 3,
            parent_id: 6564,
            children: [],
            positions: []
          },
          {
            id: 4345,
            name: 'dfgdgfg',
            depth: 3,
            parent_id: 45234,
            children: [],
            positions: []
          },
        ],
        positions: []
      },
    ],
    positions: [
      {
        id: 14,
        name: 'rere',
        price: 20
      },
      {
        id: 12,
        name: 'tttyty',
        price: 30
      },
    ]
  },
  {
    id: 33,
    name: 'wwww',
    depth: 0,
    parent_id: 22,
    children: [],
    positions: []
  },
  {
    id: 44,
    name: 'eeee',
    depth: 0,
    parent_id: 33,
    children: [],
    positions: []
  },
];
  
_.mixin({
  findDeep: function(items, attrs) {
    var key, n_key, n_value, result, value;
    result = _.findWhere(items, attrs);
    console.log(items, result, _.isUndefined(result));
    if (_.isUndefined(result)) {
      for (key in items) {
        value = items[key];
        for (n_key in value) {
          n_value = value[n_key];
          if (_.isObject(n_value) || _.isArray(n_value)) {
            result = _.findDeep(n_value, attrs);
          }
          
          // Once you find the result, you can return the founded result
          if (!_.isUndefined(result)) {
            return result;
          }
          
        }
      }
    }
    return result;
  }
});

console.log(_.findDeep(tree, {id: 5456, parent_id: 555}));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

パンダのあるツリーでリーフノードのすべての祖先を検索します

分類Dev

ツリー:他のノードと比較して共通パスが最短のノードを検索します

分類Dev

Html.BeginForm()で2つのパラメーターを検索します

分類Dev

Pythonでツリー内の一致するノードを検索します

分類Dev

JavaScriptのバイナリツリーで2つのノードがいとこノードか兄弟ノードかを確認します

分類Dev

Pythonのバイナリ検索ツリーでノードを削除しますか?

分類Dev

ツリー内のノードを検索して返す方法は?

分類Dev

いくつかのコントローラーメソッドのURLパスを検証します

分類Dev

ノードを追加し、C ++の子のリストを含むジェネリックツリー内の2つの指定されたノード間のパスのコストを検索します

分類Dev

Restangular-RestangularService.one()でいくつかのパラメータを送信します

分類Dev

いくつかのパラメーターLaravelに基づく検索条件

分類Dev

C ++、配列内の3つの最大値を検索します。これらの値の差は、パラメーターの1つです。

分類Dev

JavaScript-ノード検索でツリーのブランチを返すにはどうすればよいですか?

分類Dev

再帰を使用して、3つをパラメーターとしてバイナリツリー内のリーフノードへの最長パスを見つけます

分類Dev

マングース:クエリに応じて、いくつかのパラメーターでその場でバリデーターを追加します

分類Dev

ActiveRecordsは2つのパラメーターで検索します

分類Dev

1つのパラメーターのいくつかの異なる値でprocを実行します

分類Dev

パンダのデータフレーム列のリスト内を検索しています、エラー

分類Dev

パンダのデータフレーム列のリスト内を検索しています、エラー

分類Dev

ツリー検索-ツリー内に2つのノードがある場合、それらが接続されているかどうかを確認します-python

分類Dev

reactjsで良い年のピッカードロップダウンパッケージを検索しています。react-year-pickerを試しましたが、ライブラリにいくつかのバグがあります

分類Dev

ビューのタグで渡すパラメータを検索しましたが、役立つものは見つかりませんでした

分類Dev

nullの可能性があるストアドプロシージャのいくつかのパラメータで検索する

分類Dev

ノードリクエストの本文のパラメータタイプを検証します

分類Dev

javascriptの構造のようなツリーでフィルターを検索しますか?

分類Dev

再帰によってツリー内のノードからルートまでのすべての親を検索する

分類Dev

リスト内の一意のパラメータの合計を検索します-linq

分類Dev

seleniumjavaでonchangeパラメーターのみを持つ選択クラス値を検索します

分類Dev

パラメータ参照の1つと同一のメソッド内の参照は、パラメータが正しいことを示していますか?

Related 関連記事

  1. 1

    パンダのあるツリーでリーフノードのすべての祖先を検索します

  2. 2

    ツリー:他のノードと比較して共通パスが最短のノードを検索します

  3. 3

    Html.BeginForm()で2つのパラメーターを検索します

  4. 4

    Pythonでツリー内の一致するノードを検索します

  5. 5

    JavaScriptのバイナリツリーで2つのノードがいとこノードか兄弟ノードかを確認します

  6. 6

    Pythonのバイナリ検索ツリーでノードを削除しますか?

  7. 7

    ツリー内のノードを検索して返す方法は?

  8. 8

    いくつかのコントローラーメソッドのURLパスを検証します

  9. 9

    ノードを追加し、C ++の子のリストを含むジェネリックツリー内の2つの指定されたノード間のパスのコストを検索します

  10. 10

    Restangular-RestangularService.one()でいくつかのパラメータを送信します

  11. 11

    いくつかのパラメーターLaravelに基づく検索条件

  12. 12

    C ++、配列内の3つの最大値を検索します。これらの値の差は、パラメーターの1つです。

  13. 13

    JavaScript-ノード検索でツリーのブランチを返すにはどうすればよいですか?

  14. 14

    再帰を使用して、3つをパラメーターとしてバイナリツリー内のリーフノードへの最長パスを見つけます

  15. 15

    マングース:クエリに応じて、いくつかのパラメーターでその場でバリデーターを追加します

  16. 16

    ActiveRecordsは2つのパラメーターで検索します

  17. 17

    1つのパラメーターのいくつかの異なる値でprocを実行します

  18. 18

    パンダのデータフレーム列のリスト内を検索しています、エラー

  19. 19

    パンダのデータフレーム列のリスト内を検索しています、エラー

  20. 20

    ツリー検索-ツリー内に2つのノードがある場合、それらが接続されているかどうかを確認します-python

  21. 21

    reactjsで良い年のピッカードロップダウンパッケージを検索しています。react-year-pickerを試しましたが、ライブラリにいくつかのバグがあります

  22. 22

    ビューのタグで渡すパラメータを検索しましたが、役立つものは見つかりませんでした

  23. 23

    nullの可能性があるストアドプロシージャのいくつかのパラメータで検索する

  24. 24

    ノードリクエストの本文のパラメータタイプを検証します

  25. 25

    javascriptの構造のようなツリーでフィルターを検索しますか?

  26. 26

    再帰によってツリー内のノードからルートまでのすべての親を検索する

  27. 27

    リスト内の一意のパラメータの合計を検索します-linq

  28. 28

    seleniumjavaでonchangeパラメーターのみを持つ選択クラス値を検索します

  29. 29

    パラメータ参照の1つと同一のメソッド内の参照は、パラメータが正しいことを示していますか?

ホットタグ

アーカイブ