2016-08-12 12 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僅檢索第一密鑰和似乎沒有成爲檢索所有他們的任何功能。

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

下面是使用下劃線的解決方案: 如果你不是尋找一個下劃線解決方案,您可以在香草的JavaScript使用這樣一個功能做到這一點

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