javascript - 对象数组中的递归循环

标签 javascript arrays recursion

我正在使用的结构可能看起来像这样:

  var data =  {
        "name": "McLaren",
        "drivers": [{
            "name": "BMW",
            "drivers": [{
                "name": "Subaru",
                "drivers": [{
                    "name": "Saab",
                    "drivers": [{
                        "name": "Lexus",
                        "drivers": []
                    }, {
                        "name": "Honda",
                        "drivers": []
                    }]
                }]
            }]
        }]
    }

它是一个包含名称驱动程序数组的对象。 drivers 可以为空,但它始终存在。

现在假设我有以下对象:

{
"name": "KIA", 
"drivers":[]
}

我需要将此对象放置在正确的位置。在我的帮助下,我得到了以下信息:

McLaren/BMW/Subaru/saab

因此新对象应该被推送到与 Lexus 和 Honda 相同的数组中。

我一直在疯狂地试图弄清楚如何做到这一点。我一直在思考以下几点:

我将路径转换为数组:

var pathArr = ["McLaren","BMW","Subaru","saab"]

并尝试使用递归函数:

myFunction(newObject){

        for (var i = 0; i < pathArr.length; i++) {
          recursiveFunc(data.drivers, pathArr[i] )
        }

        var recursiveFunc(driversArr, name) {
          for (var ix = 0; ix < driversArr.length; ix++) {
            if (driversArr[ix].name === name) {        
                recursiveFunc(driversArr[ix].drivers, "HERE I NEED pathArr[1]")

            }
          }
        } 
      }

我觉得我已经很接近了,但还缺少一些东西。 我是否可能以错误的方式思考递归或使其过于复杂? 感谢帮助,谢谢!

编辑:

McLaren/BMW/Subaru/saab 指示新对象 (KIA) 应前往的路径。因此,KIA 应该位于名为 saab 的对象的 drivers-arr 中。

递归函数() 检查路径名存在于哪个数组中,然后尝试使用此对象数组深入到对象中,以便找到路径的最后部分(在本例中为 saab)。新对象应被推送到此数组。

最佳答案

这里有一个值得支持的想法:当数据难以处理时,转换您的数据。

我提出了一个可能更简单的替代解决方案:

创建一个对象,其中包含您的路径作为键,以及对关联驱动程序数组的引用作为值。

var mapping = {};
function storeMap (chain, data) {
    for (var i = 0; i < data.length; i++) {
        var updatedChain = (chain && chain + '/') + data[i].name;
        mapping[updatedChain] = data[i].drivers;
        if (data[i].drivers.length) {
            storeMap (updatedChain, data[i].drivers);
        }
    }
}

storeMap('', [data]);

然后添加您的项目:

var itemToAdd = { "name": "KIA", "drivers":[] };
var path = 'McLaren/BMW/Subaru/saab';
mapping[path].push(itemToAdd);

这本来是一次性的......在可重用性的情况下:你必须每次都运行 map 存储,这不是很有效。您可以做的是使用在修改 map 时更新 map 的方法:

function addItem (item) {
    mapping[path].push(item);
    mapping[path + '/' + item.name] = item.drivers;
}

function removeItem (item) {
    var parentPath = item.name.split('/').slice(0, -1).join('/');
    var drivers = mapping[parentPath].drivers;
    drivers.splice(drivers.indexOf(item), 1);
    delete mapping[item.name];
}

关于javascript - 对象数组中的递归循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36102175/

相关文章:

java - 卡在递归 Fork/Join 上

javascript - jQuery 单击具有 ajax 回调的按钮不起作用

javascript - 如何知道你的递归函数已经结束

javascript - 显示正确的日期后缀

php - Php Pdo 中的变量未定义

javascript - 使用reduce()将元素分割成数组

java - 如何将 EditText 放入数组中?

c++ - C++中的高性能递归函数

javascript - 尝试访问 ID 数据时无法读取 null 的属性 'username'

javascript - 从 $http 调用解析 AngularJS 中的 JSon 数据