我需要翻译的内容是:一个我正在使用的API返回一个非常奇怪的嵌套数组结构作为其注册表。我想将这个可怕的东西转换成一个对象,以便我的应用程序可以轻松地访问存储在这个输出中的整个对象。
API返回给我的输出如下:
[
[ "settings", "autoLogout", "false" ],
[ "settings", "autoLogoutMinutes", "60" ],
[ "settings", "presets", "true" ],
[ "controller", "rs232", "ip", "192.168.1.11" ],
[ "controller", "rs232", "name", "NX-22" ],
[ "source", "M23836", "slot1", "ip", "192.168.1.30" ]
]
每个数组的最后一个值代表一个条目的值,它之前的所有值加起来就是用于保存该值的键。由于大小限制,我不能只是将大型json编码对象放在那里,所以这不是可行的解决方法。
我现在使用了两个eval()的非常低效的解决方案。(我知道...那是个大忌,所以我正在寻找更好的解决方案)。我猜这可以更快地完成,但我想不出如何做到...
下面的代码片段使用了angular,因为我的应用程序是基于Angular的,但我也接受任何快速/干净的解决方案。使用原生js方法或巧妙地使用lodash或underscore等工具将非常受欢迎。
function DemoCtrl($scope){
$scope.data = [
[ "settings", "autoLogout", "false" ],
[ "settings", "autoLogoutMinutes", "60" ],
[ "settings", "presets", "true" ],
[ "controller", "rs232", "ip", "192.168.1.11" ],
[ "controller", "rs232", "name", "NX-22" ],
[ "source", "M23836", "slot1", "ip", "192.168.1.30" ]
]
$scope.init = function(){
var registry = {};
angular.forEach($scope.data, function(entry){
var keys = '';
entry.forEach(function(value, key, entry){
if( key != entry.length - 1 ){
//not last of array, so must be a key
keys += '[\'' + value + '\']';
// check if the object already exists
if( !angular.isDefined( eval('registry' + keys) ) ){
eval('registry' + keys + ' = {}');
}
}else{
//last one in this entry, must be the value
eval('registry' + keys + ' = \'' + value + '\'');
}
});
});
console.log('registry final');
console.log(registry);
$scope.registry = registry;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app>
<div ng-controller="DemoCtrl" ng-init="init()">
<pre>{{ registry | json }}</pre>
</div>
</div>
eval
。 - Jared SmithArray.pop()
弹出你想要的最后一个值,然后使用Array.reduce()
将其余部分合并为字符串键。 - Jared Smith