2016-08-12 2 views
0

Учитывая массив объектов:Получить все ключи в массиве объектов с определенным значением

var teachers = [ 
    { 
    FullName: "Mark Jones", 
    Address: "123 Main Street", 
    Students: { 
     Monday: { 
     Stone: ["8:30", "10:30"], 
     Cameron: [" ", " "], 
     Julia: [" ", " "], 
     Zoe: ["3:30", "5:30"] 
     }, 
     Tuesday: { 
     Jordan: ["12:00", "1:00"], 
     Hal: [" ", " "], 
     Kiko: [" ", " "] 
     } 
    } 
    }, 
    { 
    FullName: "Skip Roberts", 
    Address: "123 Main Street", 
    Students: { 
     Monday: { 
     Hal: ["9:30", "10:30"], 
     Hana: [" ", " "], 
     Ron: [" ", " "], 
     Lola: ["4:30", "5:30"] 
     }, 
     Tuesday: { 
     Josh: ["11:00", "12:00"], 
     George: [" ", " "], 
     Paula: ["5:00", "6:00"] 
     } 
    } 
    } 
] 

Я хотел, чтобы получить все ключи (студенческие имена) для всех значений, равных [»" , ""]. Я попытался следующие, но это дает только первый ключ и пропускает остальное (здесь я получаю ключи в понедельник:

var array = []; 
teachers.forEach(function (doc) { 
    array.push(_.findKey(doc.Students.Monday, [" ", " "])); 
}); 
console.log(array); 

Это выходы:

["Cameron", "Hana"] 

Я хотел:

["Cameron", "Julia", "Hana", "Ron"] 
+0

Вы просто хотите значение для понедельника или для каждого ключа со значением '[" "," "]' с каждого дня? – Tholle

+0

Предпочтительно все клавиши со значением ["", ""] со всех дней, если это можно сделать одним выстрелом. –

ответ

1

Проблема заключается в том, что _.findKey получает только первый ключ и не кажется, что будет какой-либо функции для получения всех из них. Если вы не ищете решение подчеркивания вы можете сделать это в ванильном JavaScript, используя функцию как этот:

var arr = []; 

function lookForEmpty(obj){ 
    for(var k in obj){ 
     var v = obj[k]; 
     if(v instanceof Array){ 
      if(v.length == 2 && v[0] == " " && v[1] == " "){ 
       arr.push(k); 
      } 
     }else if(v instanceof Object){ 
      lookForEmpty(v); 
     } 
    } 
} 

lookForEmpty(teachers); 
1

Ниже один из возможных способов ванильного JS, используя .reduce() и .filter() методы. Вы можете использовать их подчеркивание коллега точно так же.

var teachers = [{ 
 
    FullName: "Mark Jones", 
 
    Address: "123 Main Street", 
 
    Students: { 
 
     Monday : { Stone: ["8:30", "10:30"], Cameron: [" ", " "], Julia: [" ", " "], Zoe: ["3:30", "5:30"] }, 
 
     Tuesday: { Jordan: ["12:00", "1:00"], Hal: [" ", " "], Kiko: [" ", " "] } 
 
    } 
 
    }, { 
 
    FullName: "Skip Roberts", 
 
    Address: "123 Main Street", 
 
    Students: { 
 
     Monday : { Hal: ["9:30", "10:30"], Hana: [" ", " "], Ron: [" ", " "], Lola: ["4:30", "5:30"] }, 
 
     Tuesday: { Josh: ["11:00", "12:00"], George: [" ", " "], Paula: ["5:00", "6:00"] } 
 
    } 
 
}]; 
 

 
function findStudents(day) { 
 
    return teachers.reduce(function(res, cur) { 
 
    var student = cur.Students[day]; 
 

 
    return res.concat(Object.keys(student).filter(function(k) { 
 
     return (student[k][0] == " " && student[k][1] == " "); 
 
    })); 
 
    }, []); 
 
} 
 

 
var res = findStudents("Monday"); 
 
console.log(res);

1

Вот два родные JavaScript (ES6) функция, один за определенный день, и один для любого дня. Они также убедитесь, что имя занесено только один раз:

function getStudentsForDay(teachers, day) { 
 
    return [...teachers.reduce((col, teacher) => 
 
     Object.keys(teacher.Students[day]).reduce(
 
      (col, name) => teacher.Students[day][name].every(time => time == ' ') 
 
          ? col.add(name) : col, 
 
      col 
 
     ), new Set() 
 
    )]; 
 
} 
 

 
function getStudentsForAnyDay(teachers) { 
 
    return [...teachers.reduce((col, teacher) => 
 
     Object.keys(teacher.Students).reduce((col, day) => 
 
      Object.keys(teacher.Students[day]).reduce(
 
       (col, name) => teacher.Students[day][name].every(time => time == ' ') 
 
           ? col.add(name) : col, 
 
       col 
 
      ), col 
 
     ), new Set() 
 
    )]; 
 
} 
 

 
var teachers = [ 
 
    { 
 
    FullName: "Mark Jones", 
 
    Address: "123 Main Street", 
 
    Students: { 
 
     Monday: { 
 
     Stone: ["8:30", "10:30"], 
 
     Cameron: [" ", " "], 
 
     Julia: [" ", " "], 
 
     Zoe: ["3:30", "5:30"] 
 
     }, 
 
     Tuesday: { 
 
     Jordan: ["12:00", "1:00"], 
 
     Hal: [" ", " "], 
 
     Kiko: [" ", " "] 
 
     } 
 
    } 
 
    }, 
 
    { 
 
    FullName: "Skip Roberts", 
 
    Address: "123 Main Street", 
 
    Students: { 
 
     Monday: { 
 
     Hal: ["9:30", "10:30"], 
 
     Hana: [" ", " "], 
 
     Ron: [" ", " "], 
 
     Lola: ["4:30", "5:30"] 
 
     }, 
 
     Tuesday: { 
 
     Josh: ["11:00", "12:00"], 
 
     George: [" ", " "], 
 
     Paula: ["5:00", "6:00"] 
 
     } 
 
    } 
 
    } 
 
]; 
 

 
console.log('For Monday: ', getStudentsForDay(teachers, 'Monday')); 
 
console.log('For any day: ', getStudentsForAnyDay(teachers));

2

Вот решение, использующим подчеркивание:

var result = _.chain(teachers) 
    .pluck('Students') 
    .map(day => _.pick(day.Monday, times => times[0] == ' ' && times[1] == ' ')) 
    .flatten() 
    .map(_.keys) 
    .flatten() 
    .value()