如果我想迭代这样的列表:
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);
不确定从这一点开始做什么。想想我可能需要一种递归函数。想法?
答案 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
相同。