2017-09-22 8 views
2

Ich habe diese Daten JSON:Für innen für undefinierte bekommen

var lists = [{ 
     "listId": 1, 
     "permission": "WRITE" 
    }, { 
     "listId": 2, 
     "permission": "WRITE" 
    }, { 
     "listId": 2, 
     "permission": "READ" 
    }, { 
     "listId": 3, 
     "permission": "READ" 
    }, { 
     "listId": 3, 
     "permission": "WRITE" 
    }, { 
     "listId": 5, 
     "permission": "WRITE" 
    }] 

und dieses:

var arr = [{ 
    "listId": 1, 
    "confidentiality": "PUBLIC", 
    "listName": "List name here..1", 
    "permission": "WRITE" 
}, { 
    "listId": 2, 
    "confidentiality": "PUBLIC", 
    "listName": "List name here..2", 
    "permission": "READ" 
}, { 
    "listId": 3, 
    "confidentiality": "CONFIDENTIAL", 
    "listName": "List name here..3", 
    "permission": "WRITE" 
}, { 
    "listId": 4, 
    "confidentiality": "CONFIDENTIAL", 
    "listName": "List name here..4", 
    "permission": "WRITE" 
}, { 
    "listId": 5, 
    "confidentiality": "CONFIDENTIAL", 
    "listName": "List name here..5", 
    "permission": "WRITE" 
}] 

Und damit für und verschachtelt für I-Daten von arr und Filter müssen schieben zu Ergebnisse [] wenn Übereinstimmung ist listId und Erlaubnisin Listen [...]

var result = []; 

for(var i = 0; i < arr.length; i++) { 
    for(var j = 0; j < lists.length; j++) {  
    if((arr[j].listId == lists[i].listId) && (arr[j].permission == lists[i].permission)) { 
     result.push(arr[j]); 
    } 
    } 
} 
console.log(result); 

Die Probleme, die ich bekommen ListID nicht definiert, wenn arr.length kleiner als lists.length ist

Jede Idee, wie kann ich dieses Problem lösen?

Antwort

5

Die Probleme, die ich ListID undefiniert, wenn arr.length kleiner als lists.length

Sie die entsprechenden Indizes für ihre eigenen Arrays verwenden müssen, das heißt i für arr und j für lists

if((arr[i].listId == lists[j].listId) && (arr[i].permission == lists[j].permission)) 
+1

Es funktioniert, danke! –

3

Sie könnten die Struktur ein wenig mit einer Nachschlagetabelle für Berechtigungen ändern und nur eine einzige Schleife für die Ergebnismenge verwenden.

var lists = [{ listId: 1, permission: "WRITE" }, { listId: 2, permission: "WRITE" }, { listId: 2, permission: "READ" }, { listId: 3, permission: "READ" }, { listId: 3, permission: "WRITE" }, { listId: 5, permission: "WRITE" }], 
 
    array = [{ listId: 1, confidentiality: "PUBLIC", listName: "List name here..1", permission: "WRITE" }, { listId: 2, confidentiality: "PUBLIC", listName: "List name here..2", permission: "READ" }, { listId: 3, confidentiality: "CONFIDENTIAL", listName: "List name here..3", permission: "WRITE" }, { listId: 4, confidentiality: "CONFIDENTIAL", listName: "List name here..4", permission: "WRITE" }, { listId: 5, confidentiality: "CONFIDENTIAL", listName: "List name here..5", permission: "WRITE" }], 
 
    permissions = {}, 
 
    result; 
 

 
lists.forEach(function (p) { 
 
    permissions[p.listId] = permissions[p.listId] || {}; 
 
    permissions[p.listId][p.permission] = true; 
 
}); 
 

 
result = array.filter(function (a) { 
 
    return permissions[a.listId] && permissions[a.listId][a.permission]; 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Ja, schönes Beispiel! –

Verwandte Themen