Вот решение, которое почти уже есть (что-то вроде вопроса).Обратите внимание на использование Array.prototype.reduce()
для согласования списка с двумя разными подзапросами.Также обратите внимание на использование String.prototype.localeCompare()
, используемого для компаратора строк в функции сортировки.
Мне неясно, какие результаты будут получены в отсортированных результатах.Если вы предоставите желаемый отсортированный вывод, я могу подтвердить, что я достиг вашей цели.
Код прокомментирован ниже:
var VMSearchExp = ["^expand", "clone$", "bku$", "test$"];
var DatastoreExp = ["local-L03", "^BRIDGE", "^TESTLAB"];
var data = [
{VM: "TLAPP021", Datastore: "L03VM1", Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l03vcenter" },
{VM: "TLSQL003-test", Datastore: "L03VM1", Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l03vcenter" },
{VM: "RLT00021", Datastore: "L03VM2", Disk:"Hard Disk 2",Size_GB:90, Thin: true, vCenter: "l03vcenter" },
{VM: "RLTC0201", Datastore: "local-L03", Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l03vcenter" },
{VM: "TLAPP022", Datastore: "L04VM1", Disk:"Hard Disk 3",Size_GB:140, Thin: true, vCenter: "l04vcenter" },
{VM: "TLAPP022-clone", Datastore: "L04VM1", Disk:"Hard Disk 1",Size_GB:20, Thin: true, vCenter: "l04vcenter" },
{VM: "TLVMW023", Datastore: "BRIDGE", Disk:"Hard Disk 5",Size_GB:90, Thin: true, vCenter: "l03vcenter" },
{VM: "RL000001", Datastore: "TESTLAB", Disk:"Hard Disk 4",Size_GB:60, Thin: true, vCenter: "l03vcenter" },
{VM: "RLT00028", Datastore: "L04VM1", Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l04vcenter" },
{VM: "RLT00028-bku", Datastore: "L04VM1", Disk:"Hard Disk 1",Size_GB:40, Thin: true, vCenter: "l04vcenter" },
{VM: "TLADS007", Datastore: "L03VM2", Disk:"Hard Disk 2",Size_GB:50, Thin: true, vCenter: "l03vcenter" }
];
// Clone the orginal
var dataCopy = JSON.parse(JSON.stringify(data));
// Reduce the clone to exclude the VMSearchExps
dataCopy = VMSearchExp.reduce(function(acc,exp){dataCopy = dataCopy.filter(d=>!d.VM.match(exp)); return dataCopy}, VMSearchExp[0]);
console.log("Count 8: Originally 11: ",dataCopy);
// Reduce the clone to exclude the DatastoreExps
dataCopy = DatastoreExp.reduce(function(acc,exp){dataCopy = dataCopy.filter(d=>!d.Datastore.match(exp)); return dataCopy},DatastoreExp[0]);
console.log("Count 5: Originally 8: ",dataCopy);
// Sort: if any of a.[vCenter,VM,Datastore,Disk] comes before any of those in b -> promote it
result = dataCopy.sort(function(a,b) {
a.vCenter.localeCompare(b.vCenter) ||
a.VM.localeCompare(b.VM) ||
a.Datastore.localeCompare(b.Datastore) ||
a.Disk.localeCompare(b.Disk)
});
// Sorted result
console.log("Sorted: ",result);