Un'API con cui sto parlando restituisce il suo registro in una struttura di array nidificata molto dispari. Voglio convertire questa mostruosità in un oggetto in modo che la mia applicazione abbia facile accesso a tutti gli oggetti memorizzati all'interno di questo output.Converti matrice nidificata in oggetto
L'uscita l'API mi dà assomiglia a questo:
[
[ "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" ]
]
L'ultimo valore in ogni matrice rappresenta il valore di una voce, tutto prima che l'ultimo si aggiunge alla chiave utilizzata per salvare il valore. A causa delle limitazioni di dimensione, non posso semplicemente rilasciare grandi oggetti json-encoded, quindi non è una soluzione praticabile.
Ora ho creato una soluzione piuttosto sporca e lenta che coinvolge 2 eval(). (Lo so ... è un no-no, quindi sto cercando una soluzione migliore) Immagino che questo possa essere fatto molto più velocemente, ma non riesco a capire come ...
Il frammento di seguito usa angolare perché la mia applicazione è basata su Angular, ma sono aperto a qualsiasi soluzione veloce/pulita. Un approccio alla vaniglia o un uso intelligente di qualcosa come lodash o underscore sarebbe molto gradito.
La mia soluzione sporco e lento ora
function DemoCtrl($scope){
\t $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{
\t //last one in this entry, must be the value
\t eval('registry' + keys + ' = \'' + value + '\'');
\t }
});
});
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>
Eventuali duplicati di [Convertire Array a Object] (http://stackoverflow.com/questions/4215737/convert-array- to-object) –
Obbligatorio mai * mai * usare 'eval' a meno che tu non sappia * esattamente * cosa stai facendo. –
@dfsq grazie per quella modifica, cercava quel filtro;) – JasperZelf