Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript获取数组中项的父项_Javascript_Jquery_Arrays_Angularjs_Underscore.js - Fatal编程技术网

Javascript获取数组中项的父项

Javascript获取数组中项的父项,javascript,jquery,arrays,angularjs,underscore.js,Javascript,Jquery,Arrays,Angularjs,Underscore.js,我试图获取数组中特定(引用)对象的父对象。 例如: 当某些事情发生时,我会得到以下结果: var clicked = { key: "value3a" } 在本例中,我知道已单击了value3a,它与data变量进行了数据绑定 问题是,如何轻松地单击的父项?它应该返回我想要的value3的整个子数组: [ { key: "value3a" }, { key: "value3b" } ] 注意:目前我正在使用下划线来查找数

我试图获取数组中特定(引用)对象的父对象。 例如:

当某些事情发生时,我会得到以下结果:

var clicked = {
    key: "value3a"
}
在本例中,我知道已单击了
value3a
,它与
data
变量进行了数据绑定

问题是,如何轻松地单击
的父项?它应该返回我想要的
value3
的整个子数组:

[
    {
        key: "value3a"
    },
    {
        key: "value3b"
    }
]

注意:目前我正在使用下划线来查找数组的对象。所以也许下划线有帮助?

只需创建一个子-父映射,以便您可以查找所需内容:

var map = {};
function recurse(arr, parent) {
    if (!arr) return;
    for (var i=0; i<arr.length; i++) { // use underscore here if you find it simpler
        map[arr[i].key] = parent;
        recurse(arr[i].children, arr[i]);
    }
}
recurse(data, {key:"root", children:data});

可以使用递归reduce函数

// Given
var data = [
    {
        key: "value1",
        children: [
            {
                key: "value2"
            },
            {
                key: "value3",
                children: [
                    {
                        key: "value3a"
                    },
                    {
                        key: "value3b"
                    }
                ]
            }
        ]
    },
    {
        key: "value4"
    }
];
var clicked = {
    key: "value3a"
};
我们可以定义一个递归reduce函数,并将其作为父函数 作为上下文

var rec_reduce = function(memo, obj) {
    if(obj.key == clicked.key) {
        return this || memo;
    }
    return _.reduce(obj.children, rec_reduce, memo, obj.children) || memo;
};

// Now we can lookup the key in clicked with one line
_.reduce(data, rec_reduce, null, data);

// Returns [{key: "value3a"}, {key: "value3b"}]
或者,如果您想按照第一个答案中的建议利用下划线制作地图,则更简单:

var map = {};
var rec_map = function(obj, i, parent) {
    map[obj.key] = parent;
    _.each(obj.children, rec_map);
};
_.each(data, rec_map);

// Now getting the parent list is just a look up in the map
map[clicked.key]

// Returns [{key: "value3a"}, {key: "value3b"}]

看一看这个例子,它演示了一个带有click的树:查看链接的可能重复项
var rec_reduce = function(memo, obj) {
    if(obj.key == clicked.key) {
        return this || memo;
    }
    return _.reduce(obj.children, rec_reduce, memo, obj.children) || memo;
};

// Now we can lookup the key in clicked with one line
_.reduce(data, rec_reduce, null, data);

// Returns [{key: "value3a"}, {key: "value3b"}]
var map = {};
var rec_map = function(obj, i, parent) {
    map[obj.key] = parent;
    _.each(obj.children, rec_map);
};
_.each(data, rec_map);

// Now getting the parent list is just a look up in the map
map[clicked.key]

// Returns [{key: "value3a"}, {key: "value3b"}]