在数组中深入搜索并删除

时间:2016-01-06 09:21:15

标签: javascript arrays

我得到了以下数组:

var arr = [
    {
        1: {
            id: 1,
            title: 'test'
        },
        children: [
            {
                1: {
                    id: 2,
                    title: 'test2'
                }
            }
        ]
    }
];

直接在数组中的对象是组。 1:是第一语言,2:是第二语言等.id存储在每个语言对象中(由于我正在使用的数据库)。 children数组的构建方式与'arr'数组相同。

多个孩子的例子:

var arr = [
    {
        1: {
            id: 1,
            title: 'test'
        },
        children: [
            {
                1: {
                    id: 2,
                    title: 'test2'
                },
                children: [
                    {
                        1: {
                            id: 3,
                            title: 'test3',
                        },
                        children: []
                    }
                ]
            }
        ]
    }
];

现在我需要从这个数组中删除项目。你可以拥有无​​限的孩子​​(我的意思是,孩子可以生孩子,可以生孩子等)。我有一个需要发送ID参数的函数。我的想法是获得正确的对象,其中语言1的ID是id参数。我明白了:

function deleteFromArray(id)
{   
    var recursiveFunction = function (array)
    {
        for (var i = 0; i < array.length; i++)
        {
            var item = array[i];

            if (item && Number(item[1].ID) === id)
            {
                delete item;
            }
            else if (item && Number(item[1].ID) !== id)
            {
                recursiveFunction(item.children);
            }
        }
    };

    recursiveFunction(arr);
}

但是,我正在删除除数组中项目之外的局部变量项。我不知道如何解决这个问题。我一直在寻找互联网,但没有找到任何东西。

2 个答案:

答案 0 :(得分:0)

&#13;
&#13;
var arr = [{ 1: { id: 1, title: 'test' }, children: [{ 1: { id: 2, title: 'test2' }, children: [{ 1: { id: 3, title: 'test3', }, children: [] }] }] }];

function deleteFromArray(id) {   
    function recursiveFunction(arr) {
        for (var i = 0; i < arr.length; i++) {
            var item = arr[i];
            if (item && Number(item[1].id) === id) {
                arr.splice(i, 1);
            } else if (item && Number(item[1].id) !== id) {
                item.children && recursiveFunction(item.children);
            }
        }       
    };

    recursiveFunction(arr);
};

deleteFromArray(2);
document.getElementById("output").innerHTML = JSON.stringify(arr, 0, 4);
&#13;
<pre id="output"></pre>
&#13;
&#13;
&#13;

jsfiddle:https://jsfiddle.net/x7mv5h4j/2/

deleteFromArray(2)会使children为空,deleteFromArray(1)会使arr自行清空。

答案 1 :(得分:0)

如果找到id,此提案将为递归调用和Array.prototype.some()提供迭代和短路功能。然后数组与Array.prototype.splice()拼接。

&#13;
&#13;
var arr = [{ 1: { id: 1, title: 'test' }, children: [{ 1: { id: 2, title: 'test2' }, children: [{ 1: { id: 3, title: 'test3', }, children: [] }] }] }];

function splice(array, id) {
    return array.some(function (a, i) {
        if (a['1'].id === id) {
            array.splice(i, 1)
            return true;
        }
        if (Array.isArray(a.children)) {
            return splice(a.children, id);
        }
    });
}

splice(arr, 2);
document.write('<pre>' + JSON.stringify(arr, 0, 4) + '</pre>');
&#13;
&#13;
&#13;