Nested For Loops JavaScript

0

Ho un'app che ottiene i dati dal database (MongoDB) in formato JSON. I dati restituiti contengono array annidati e voglio accedere ai valori negli array annidati. Il formato JSON restituito è simile al seguente:

[
 {"_id": "81724587125","name": "Object 1", "arrayOne":["1","2","3"]},
 {"_id": "87687687687","name": "Object 2", "arrayOne":["4","5","6"]}
]

Ora quello che voglio è recuperare i valori da arrayOne da tutti gli oggetti e inserirli in un unico array in questo modo:

combinedValues:["1","2","3","4","5","6"]

Per raggiungere questo obiettivo ho utilizzato Nested For Loops di seguito è il mio codice effettivo:

 function myFunc(result){

    $scope.clients = [];

    for(var i = 0; i < result.length; i++){
      for(var x = 0; x < result[i].sectorClients.length; x++){
        $scope.clients.push(result[i].sectorClients[x]);
      }
    }       
};

Il codice sopra funziona perfettamente e fa ciò che voglio che faccia.

La mia domanda:

L'uso di cicli nidificati per questa particolare situazione è una buona pratica di programmazione? C'è un modo migliore per ottenere la stessa funzionalità? Ho sentito persone dire che l'annidamento per loops può essere un processo "costoso".

    
posta Lorenzo von Matterhorn 14.03.2016 - 10:59
fonte

4 risposte

1

Come ho detto nei commenti, puoi ottenere lo stesso risultato direttamente da MongoDB usando una query MapReduce ; Tuttavia un equivalente JavaScript più pulito per i tuoi loop annidati può essere qualcosa del tipo:

var data = [
 {"_id": "81724587125","name": "Object 1", "arrayOne":["1","2","3"]},
 {"_id": "87687687687","name": "Object 2", "arrayOne":["4","5","6"]}
];

var result = data.reduce(function (previousValue, currentValue, currentIndex, array) {
    return previousValue.arrayOne.concat( currentValue.arrayOne );
});
    
risposta data 14.03.2016 - 11:26
fonte
1

I cicli annidati sono costosi quando entrambi eseguono un'iterazione su dati indipendenti in modo "incrociato", poiché possono rappresentare un algoritmo O (n ^ 2) che può essere reso più efficiente. Potresti pensare a questi loop come a descrivere il programma "per ogni elemento in X , scorrere su ogni elemento in Y di nuovo".

Questo non è uno di quei casi. I tuoi dati sono una serie di oggetti, ciascuno contenente ulteriori matrici di oggetti. Un loop annidato qui non è solo soddisfacente: è completamente espressivo e appropriato.

    
risposta data 14.03.2016 - 11:59
fonte
-1

nel caso, non è necessario utilizzare la funzione "puth", spingere ogni piccolo elemento nell'array, perché è possibile utilizzare l'intero array per esempio: [1,2,3] .concat ([4,5,6])  = > [1, 2, 3, 4, 5, 6]

quindi puoi migliorare il tuo codice riducendo il ciclo

    
risposta data 14.03.2016 - 11:06
fonte
-1

Puoi usare la funzione map della matrice per ottenere le proprietà ( arrayOne ) che desideri e creare una matrice appiattita dalla matrice di array (array di arrayOne s) usando riduci.

var clients = results
  .map(function(r){ return r.arrayOne; })
  .reduce(function(prev, curr) { return prev.concat(curr); }, []);
// ["1", "2", "3", "4", "5", "6"]

Risorse:

risposta data 14.03.2016 - 12:47
fonte

Leggi altre domande sui tag