2016-05-16 4 views
0

Ich habe folgende Array von ObjektenÄnderung Eltern-Kind-bezogenen ids von verschachtelten Objekten

{ 
    id: 'a', 
    parent_id: 'root' 
} 

    { 
     id: 'a1', 
     parent_id: 'a' 
    } 

     { 
      id: 'a11', 
      parent_id: 'a1' 
     } 
     { 
      id: 'a12', 
      parent_id: 'a1' 
     } 
     { 
      id: 'a13', 
      parent_id: 'a1' 
     } 
     . 
     . 
     . 
     . 
     . 

    { 
     id: 'a2', 
     parent_id: 'a' 
    } 

     { 
      id: 'a21', 
      parent_id: 'a2' 
     } 
     { 
      id: 'a22', 
      parent_id: 'a2' 
     } 
     { 
      id: 'a23', 
      parent_id: 'a2' 
     } 
     . 
     . 
     . 
     . 
     . 

Ich habe ein Root-Element mit der ID a und es hat mehrere Kinder (sind Kinder mit parent_id Eigenschaft gespeichert)

Ich spare im selben Format in Mongodb. Ich möchte dieselben Datensätze mit einem anderen Benutzer teilen und

Mein Datenmodell benötigt diese IDs eindeutig, also möchte ich nur diese Array von Objekten in eine separate Variable kopieren und ändert diese IDs in zufällige Zeichenfolgen Eltern-Kind-Beziehung beibehalten .

kann ich zufällige Zeichenfolge aus einer der Bibliotheken generieren mit Random.id() jetzt weiß ich nicht, wie eine Schleife durch die alle Kinder und die Eigenschaft id und parent_id ändern, jede mögliche Hilfe geschätzt.

Danke.

+1

Die IDs sind bereits einzigartig .. was ist das Problem.? Möchten Sie die Objektstruktur verschachteln? – Redu

+0

@Redu Ich möchte den gleichen Satz von Karten für verschiedene Benutzer speichern, also muss ich denselben Satz von '_id' in derselben Sammlung speichern. Aus diesem Grund, bevor ich den gleichen Satz der Sammlung für verschiedene Benutzer speichern möchte, möchte ich die IDs ändern. – user555

Antwort

1

Ich denke, das könnte sein, was Sie wollten;

function makeUniqueId(){ 
 
    var id = "", 
 
    charList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 
 
    numList = ""; 
 
    for(var i=0; i < 2; i++) id += charList.charAt(Math.floor(Math.random() * charList.length)); 
 
    for(var j=0; j < 3; j++) id += numList.charAt(Math.floor(Math.random() * 10)); 
 
    return !~uil.indexOf(id) ? (uil.push(id),id) : makeId(); 
 
} 
 
var uil = [], // unique id list 
 
    data = [ 
 
    { 
 
    id: 'a', 
 
    parent_id: 'root' 
 
},{ 
 
    id: 'a1', 
 
    parent_id: 'a' 
 
},{ 
 
    id: 'a11', 
 
    parent_id: 'a1' 
 
},{ 
 
    id: 'a12', 
 
    parent_id: 'a1' 
 
},{ 
 
    id: 'a13', 
 
    parent_id: 'a1' 
 
},{ 
 
    id: 'a2', 
 
    parent_id: 'a' 
 
},{ 
 
    id: 'a21', 
 
    parent_id: 'a2' 
 
},{ 
 
    id: 'a22', 
 
    parent_id: 'a2' 
 
},{ 
 
    id: 'a23', 
 
    parent_id: 'a2' 
 
}]; 
 

 
data.forEach((e,i,a) => {var puid = makeUniqueId(); 
 
         a.forEach(f => f.parent_id == e.id && (f.parent_id = puid)); 
 
         e.id = puid; 
 
         }); 
 
document.write("<pre>" + JSON.stringify(data,null,2) + "</pre>");

Jedesmal, führen Sie den Code, den Sie verschiedene einzigartige Werte für die id und parent_id Felder erhalten. Wenn Sie diesen bekommen wollen, dann ist das eine völlig andere Geschichte.

+0

Ja, diese Karten sind tief verschachtelt, also möchte ich eine Lösung für 'n' level. Vielen Dank für die Antwort – user555

+0

Der obige Code weist die korrekten eindeutigen IDs gemäß der ursprünglich angegebenen elterlichen Beziehung zu. Sie müssen es nur jedes Mal ausführen, wenn Sie einen neuen Satz mit eindeutigen IDs generieren müssen. Wenn Sie jedoch möchten, dass diese flache Struktur verschachtelt wird, dann überprüfen Sie diese Antwort von mir http://StackOverflow.com/a/37208104/4543207 – Redu

1

ich eine Lösung herauszufinden, können Sie in den Code graben ...

Der Code der max-ID finden und dann den Baum gehen, die IDs zu ändern, wenn Sie einen alphanumerischen ID benötigen, können Sie mache eine Art zufälliger ID und benutze die gleiche Wanderfunktion.

var data = [{id: 10, parent_id:null}, {id: 20, parent_id:10}]; 
 

 
function findTopLevel() { 
 
    return data.find(function(val, i, arr) { return val.parent_id == null || val.parent_id == undefined }); 
 
}; 
 

 
function findChildren(parent) { 
 
    return data.filter(function(val, i, arr) { return val.parent_id == parent.id }); 
 
}; 
 

 
function findMaxId(node, max) { 
 
    max = Math.max(node.id, max || -1); 
 
    var children = findChildren(node); 
 
    for (var i = 0; i < children.length; i++) { 
 
    max = findMaxId(children[i], max); 
 
    } 
 
    return max; 
 
}; 
 

 
function walk(parent) { 
 
    var parentId = ++maxId; 
 
    var children = findChildren(parent); 
 
    parent.id = parentId; 
 
    for (var i in children) { 
 
    children[i].parent_id = parentId; 
 
    walk(children[i]); 
 
    } 
 
}; 
 

 
var topLevel = findTopLevel(); 
 

 
var maxId = findMaxId(topLevel); 
 

 
walk(topLevel); 
 

 
console.log(maxId, data)

Verwandte Themen