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
答案 0 :(得分: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。
答案 1 :(得分:1)
这可能会给你一个开始。未经过全面测试或高度优化,并假设使用jQuery(将jQuery utilty函数替换为其他实现应该不是一个大问题。)
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);
}
答案 2 :(得分:0)
如果您愿意使用库,我认为Underscore.js的功能可以使用_.find(),_。pluck()或_.pick()来获取您正在寻找的内容。还有很多其他方法可以帮助解决这个问题。
如果您想在核心JS中进行,请查看Underscore源代码的封面,其中包含FANTASTIC注释/文档: