1
function array_searchRecursive( $needle, $haystack, $strict=false, $path=array() )
{
    if( !is_array($haystack) ) {
        return false;
    }

    foreach( $haystack as $key => $val ) {

        if( is_array($val) && $subPath = array_searchRecursive($needle, $val, $strict, $path) ) {
            $path = array_merge($path, array($key), $subPath);

            return $path;
        } else if( (!$strict && $val == $needle) || ($strict && $val === $needle) ) {

            $path[] = $key;
            return $path;
        }
    }
    return false;
}

JavaScriptで実装できる同じ機能を提案してくれる人はいますか。参照http://www.php.net/manual/en/function.array-search.php#68424

4

3 に答える 3

1

確かにアンダースコア(またはおそらくより良いパフォーマンス:lodash)はあなたの男です。JavaScript は大部分が関数型言語であり、最新の仕様にはアンダースコアが提供するほとんどの機能が含まれています。ブラウザー互換の場合は、引き続きアンダースコアを使用することをお勧めします。

あなたの状況で最高のアンダースコア機能は次のとおりです。

var haystack = [
  {a: 1}, [{b: 2}, {c: 3}, [{d: 4}, {e: 5}, [{f: 6}, {g: 7}] ] ]
],
needle = 4;

//Search
var result = _(haystack).chain() //chain so we can keep underscoring
  .flatten() //flatten the array
  .find(function(o) { //find the first element that matches our search function
    return _(o).chain() //chain so we can keep underscoring
      .values() //get all object values as an array
      .contains(needle) //see if any of our values contains the needle
      .value(); //get out of the chain
  })
  .value(); //get out of the chain

//In short:
var result = _(haystack).chain().flatten().find(function(o) { return _(o).chain().values().contains(needle).value(); }).value();

もちろん、これを微調整して $strict などを実装する必要があります。

于 2012-10-09T15:39:27.420 に答える
1

これで始められるかもしれません。十分にテストされていないか高度に最適化されておらず、jQuery の使用を前提としています (jQuery ユーティリティ関数を他の実装に置き換えても大きな問題にはなりません)。

function searchArrayRecursive(needle, haystack, strict) {

    function constructPath(needle, haystack, path, strict) {
        if (!$.isArray(haystack)) {
            return false;
        }
        var index;
        for (index = 0; index < haystack.length; index++) {
            var value = haystack[index];
            var currentPath = $.merge([], path);
            currentPath.push(index);

            if ((strict && value === needle) || (!strict && value == needle)) {
                return currentPath;
            }
            if ($.isArray(value)) {

                var foundPath = constructPath(needle, value, currentPath, strict);
                if (foundPath) {
                    return foundPath;
                }
            }
        }

        return false;
    }


    return constructPath(needle, haystack, [], strict);
}

http://jsfiddle.net/b8TxJ/2/

于 2012-10-09T18:14:11.317 に答える
0

ライブラリを使用することに慣れている場合、Underscore.jsには、おそらく_.find()、_。pluck()、または_.pick()を使用して、探しているものを取得する機能があると思います。これを助けることができる他のたくさんの方法があります。

コアJSでそれを実行したい場合は、FANTASTICアノテーション/ドキュメントが含まれているアンダースコアソースコードの裏側を覗いてみてください。

http://underscorejs.org/docs/underscore.html

于 2012-10-09T15:10:13.890 に答える