2016-08-12 13 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() 
相关问题