Javascript在数组中获取item的父级

时间:2015-05-01 10:51:13

标签: javascript jquery arrays angularjs underscore.js

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

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可以提供​​帮助吗?

2 个答案:

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