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"}]