Javascript:将几个孩子深深地附在物体上?

时间:2015-09-16 20:59:35

标签: javascript arrays object

如果我想迭代这样的列表:

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);

不确定从这一点开始做什么。想想我可能需要一种递归函数。想法?

1 个答案:

答案 0 :(得分:1)

对代码进行最少的更改:

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相同。