给对象附加子节点

Javascript: attach child several deep to object?

本文关键字:子节点 对象      更新时间:2023-09-26

如果我想像这样遍历一个列表:

var inputArray = [
    'CHILD0',
    'PARENT0_CHILD1',
    'PARENT1_PARENT2_CHILD2',
    'PARENT1_PARENT3_CHILD3',
    'PARENT1_PARENT3_CHILD4'
];

让它返回一个对象,像这样:

var resultObject = {
    CHILD0: null,
    PARENT0: {CHILD1: null},
    PARENT1: {
        PARENT2: {CHILD2: null},
        PARENT3: {
            CHILD3: null,
            CHILD4: null    
        }
    }
};

我如何通过数组迭代返回结果?

我有这样的东西:

function iterateArray (inputArray) {
  var _RESULT = {};
  for (var i = 0; i < inputArray.length; i += 1) {
    var _inputName = inputArray[i];
    var _inputNameArray = _input.split('_');
    var _ref;
    for (var n = 0; n < _inputNameArray.length; n += 1) {
      //...?
    }
    _RESULT[_ref] = null;
  }
  return _RESULT;
}
var resultObject = iterateArray(inputArray);

不知道从这一点上该做什么。我想我可能需要一个递归函数。想法吗?

对代码进行最小的修改:

function iterateArray (inputArray) {
  var _RESULT = {};
  for (var i = 0; i < inputArray.length; i += 1) {
    var _inputName = inputArray[i];
    var _inputNameArray = _inputName.split('_');
    var _ref = _RESULT;
    for (var n = 0; n < _inputNameArray.length - 1; n += 1) {
      if (!_ref[_inputNameArray[n]]) _ref[_inputNameArray[n]] = {};
      _ref = _ref[_inputNameArray[n]];
    }
    _ref[_inputNameArray[n]] = null;
  }
  return _RESULT;
}

永远不需要递归,因为它总是可以在迭代中展开(反之亦然)。有时候,不管怎样,事情总会变得更好。

编辑:这些下划线是什么意思?:)

EDIT2:理解这一点的关键是参考共享。例如:

  • 对于CHILD0, _ref = _RESULT表示两个变量都指向同一个{} 。当您执行_ref['CHILD0'] = null时,它与执行_RESULT['CHILD0'] = null相同。

  • 对于PARENT0_CHILD1,首先是_ref = _RESULT,因此_ref['PARENT0'] = {}_RESULT['PARENT0'] = {}相同。然后我们将_ref的含义转换为与_RESULT['PARENT0']相同的含义;当我们分配_ref['CHILD1'] = null时,它与分配_RESULT['PARENT0']['CHILD1'] = null相同。