2017-09-05 1 views
-1

Ich habe ein Array von Objekten zu durchlaufen, die wie folgt aussieht:Wie durch eine Reihe von Objekteigenschaften in einem Array von Objekten

data = [ 
    { 
    title: 'John Doe', 
    departments: [ 
     { name: 'Marketing', slug: 'marketing'}, 
     { name: 'Sales', slug: 'sales'}, 
     { name: 'Administration', slug: 'administration'}, 
    ] 
    }, 
    { 
    title: 'John Doe Junior', 
    departments: [ 
     { name: 'Operations', slug: 'operations'}, 
     { name: 'Sales', slug: 'sales'}, 
    ] 
    }, 
    { 
    title: 'Rick Stone', 
    departments: [ 
     { name: 'Operations', slug: 'operations'}, 
     { name: 'Marketing', slug: 'marketin'}, 
    ] 
    }, 
] 

Wie kann ich über jedes Objekt Abteilungen Array iterieren und neue Arrays erstellen wo ich Mitarbeiter nach Abteilungen sortiert haben, so dass das Endergebnis diese würden:

operations = [ 
    { 
    title: 'John Doe Junior', 
    departments: [ 
     { name: 'Operations', slug: 'operations'}, 
     { name: 'Sales', slug: 'sales'}, 
    ] 
    }, 
    { 
    title: 'Rick Stone', 
    departments: [ 
     { name: 'Operations', slug: 'operations'}, 
     { name: 'Marketing', slug: 'marketin'}, 
    ] 
    }, 
] 

marketing = [ 
    { 
    title: 'John Doe', 
    departments: [ 
     { name: 'Marketing', slug: 'marketing'}, 
     { name: 'Sales', slug: 'sales'}, 
     { name: 'Administration', slug: 'administration'}, 
    ] 
    }, 
    { 
    title: 'Rick Stone', 
    departments: [ 
     { name: 'Operations', slug: 'operations'}, 
     { name: 'Marketing', slug: 'marketin'}, 
    ] 
    }, 
] 

Was wäre der Weg dynamisch diese Art von Arrays zu erstellen?

aktualisieren

Ich habe versucht, mit einer Lösung mit dem Vorschlag aus der Antwort zu kommen, wo ich ein Array mit Abteilung Objekten dynamisch erstellen, die eine Reihe von Mitarbeitern haben würden:

const isInDepartment = departmentToCheck => employer => employer.departments.find(department => department.slug == departmentToCheck); 

var departments = []; 
function check(departments, name) { 
    return departments.some(object => name === object.department); 
} 

employees.forEach((employee) => { 
    employee.departments.forEach((department) => { 
     let found = check(departments, department.slug); 
     if (!found) { 
      departments.push({ department: department.slug }); 
     } 
     }); 
}); 

departments.forEach((department) => { 
    // push an array of employees to each department 
    //employees.filter(isInDepartment(department)); 
}); 

Aber ich weiß nicht, wie kann ich das Array von Mitarbeitern auf das Objekt in dem Array schieben, die ich am Ende Schleife bin? Dies ist die fiddle.

+0

Was haben Sie versucht? Sie müssten ['Object'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#Methods_of_the_Object_constructor) und [' Array'] verwenden (https: // developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Methods_2) Methoden. – Xufox

+0

@ T.J.Crowder Ich habe die Frage bearbeitet und die Syntax – Leff

+0

welche Art von Syntax ist das? Sie können console.log verwenden, um eine saubere Darstellung einer Variablen in json wie folgt auszugeben: console.log (JSON.stringify (someVar)); – Ericson578

Antwort

1

Wie wäre es damit? Ich benutze Operation, und ich verwende eine Funktion höherer Ordnung (in diesem Fall eine Funktion, die eine Funktion zurückgibt), um das Prädikat zu erstellen (Funktion, die einen booleschen Wert zurückgibt), die überprüft, ob ein Mitarbeiter in einer bestimmten Abteilung ist. Ich habe einige (hoffentlich) klärende Kommentare in den Code eingefügt.

Bearbeiten: mit dem neuen Code und Kontext, den Sie zur Verfügung gestellt this JSFiddle demo zeigt, wie es zusammenarbeiten würde.

const employees = [ 
 
    { 
 
    title: 'John Doe', 
 
    departments: [ 
 
     { name: 'Marketing', slug: 'marketing'}, 
 
     { name: 'Sales', slug: 'sales'}, 
 
     { name: 'Administration', slug: 'administration'} 
 
    ] 
 
    }, 
 
    { 
 
    title: 'John Doe Junior', 
 
    departments: [ 
 
     { name: 'Operations', slug: 'operations'}, 
 
     { name: 'Sales', slug: 'sales'} 
 
    ] 
 
    }, 
 
    \t { 
 
    title: 'Rick Stone', 
 
    departments: [ 
 
     { name: 'Operations', slug: 'operations'}, 
 
     { name: 'Marketing', slug: 'marketin'} 
 
    ] 
 
    } 
 
]; 
 

 
// given a department, this returns a function that checks 
 
// whether an employee is in the specified department 
 
// NOTE: the "find" returns the found object (truthy) 
 
// or undefined (falsy) if no match was found. 
 
const isInDepartment = 
 
\t departmentToCheck => 
 
    \t employee => employee.departments.find(dep => dep.name == departmentToCheck); 
 

 
const employeesInMarketing = employees.filter(isInDepartment('Marketing')); 
 
const employeesInOperations = employees.filter(isInDepartment('Operations')); 
 

 
console.log('Employees in marketing', employeesInMarketing); 
 
console.log('Employees in operations', employeesInOperations);

+0

Ich verstehe den Grund für die Ablehnung nicht. Es könnte mehr Erklärung verwenden, aber das ist nichts wie ein Grund, es zu downvote. –

+0

Danke. Nun, es war sehr schnell down-vote (so weit ich das beurteilen konnte), also fragte ich mich, ob es einen automatischen Downvote gab, wenn man eine Frage mit negativem Ergebnis beantwortete (Haven't Kopf einer solchen Regel vorher, aber es würde * einige * Sinn.) Btw. Ich fügte dem Code einige Kommentare hinzu. Glaubst du, dass es mehr Platz für Erklärungen gibt? Wenn ja, wo? – jonahe

+1

Vielen Dank für Ihren Vorschlag, ich habe meine Frage mit Ihrem Code aktualisiert, ich versuche dynamisch ein Array mit Abteilungen Objekt zu erstellen, das würde dann die Mitarbeiter überprüfen, aber aus irgendeinem Grund, bekomme ich keine eindeutigen Werte mit Meine Funktion gefunden. – Leff

Verwandte Themen