【问题标题】:Javascript get parent of item in arrayJavascript获取数组中项目的父级
【发布时间】:2015-07-11 05:00:05
【问题描述】:

我正在尝试获取数组中特定(引用)对象的父级。 示例:

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

【问题讨论】:

标签: javascript jquery arrays angularjs underscore.js


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以使用递归归约函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 2012-01-15
      • 1970-01-01
      • 2021-06-24
      • 2013-06-24
      • 2017-12-15
      • 1970-01-01
      相关资源
      最近更新 更多