我试图获取数组中特定(引用)对象的父级。 例如:
var data = [
{
key: "value1"
children: [
{
key: "value2"
},
{
key: "value3"
children: [
{
key: "value3a"
},
{
key: "value3b"
}
]
}
]
},
{
key: "value4"
}
];
当发生某些事情时,我会得到以下信息:
var clicked = {
key: "value3a"
}
在这种情况下,我知道value3a
已被点击,并且它与data
变量数据绑定。
问题是,如何轻松获得clicked
的父母?它应该返回我想要的value3
的整个子数组:
[
{
key: "value3a"
},
{
key: "value3b"
}
]
注意:目前我正在使用UnderscoreJS来查找我的数组的对象。也许UnderscoreJS可以提供帮助吗?
答案 0 :(得分:0)
只需创建一个子父地图,以便您可以查找所需内容:
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});
现在,在您的事件处理程序中,您可以轻松地使用该地图查找您的兄弟姐妹:
map[clicked.key].children
答案 1 :(得分:0)
您可以使用递归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"}]