искать массив объектов внутри объектов в JavaScript - PullRequest
0 голосов
/ 19 сентября 2019

Я работаю с API остальных, который возвращает данные, так что

students = [{
  batch_id: 22
  id: 1
  image: null
  name: "a new batch student",
    attendance: [
      { id: 1, student_id: 1, batch_id: 22, absent_on: "2019-09-15", time: "09:26:23" },
      { id: 9, student_id: 1, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }
    ]

},
{
  batch_id: 22
  id: 2
  image: null
  name: "a new batch student",
    attendance: [
      { id: 9, student_id: 2, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }
    ]

},
{
  batch_id: 22
  id: 12
  image: null
  name: "a new batch student",
    attendance: []

}]````  

есть ли способ поиска / поиска в массиве «посещаемости», который соответствует дате, которую я указал, например, отсутствует на == 2019-09-19

могу ли я преобразовать вышеуказанный массив так, чтобы массив посещаемости в массиве студентов выглядел примерно так

students = [{
  batch_id: 22
  id: 1
  image: null
  name: "a new batch student",
    attendance: [
      { id: 9, student_id: 1, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }
    ]

},
{
  batch_id: 22
  id: 2
  image: null
  name: "a new batch student",
    attendance: [
      { id: 9, student_id: 2, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }
    ]

},
{
  batch_id: 22
  id: 12
  image: null
  name: "a new batch student",
    attendance: []

}]

Заранее благодарен за любую помощь

Ответы [ 5 ]

2 голосов
/ 19 сентября 2019
function absentStudents(date){
  return students
    .filter(({attendance}) => !!attendance.some(({absent_on}) => absent_on === date).length);
}

absentStudents('2019-09-19') Должен вернуть вам список студентов, отсутствующих на 2019-09-19

1 голос
/ 19 сентября 2019

Чтобы получить точные ожидаемые данные со всеми возвращенными студентами и только с отсутствующей датой, если она была на 2019-09-19, вы можете сделать:

const students = [{
  batch_id: 22,
  id: 1,
  image: null,
  name: "a new batch student",
    attendance: [
      { id: 1, student_id: 1, batch_id: 22, absent_on: "2019-09-15", time: "09:26:23" },
      { id: 9, student_id: 1, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }
    ]

},
{
  batch_id: 22,
  id: 2,
  image: null,
  name: "a new batch student",
    attendance: [
      { id: 9, student_id: 2, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }
    ]

},
{
  batch_id: 22,
  id: 12,
  image: null,
  name: "a new batch student",
    attendance: []

}];

const studentsAbsentOnDate = students.map(student => ({
  ...student,
  attendance: student.attendance.filter((day) => day.absent_on === "2019-09-19"),
}));

console.log(studentsAbsentOnDate);
0 голосов
/ 20 сентября 2019

Позвольте мне познакомить вас с Filter и Some .

Array.Filter () - это метод фильтрации массива на основе некоторого условия.Фильтр зацикливается на всех элементах массива, и если они удовлетворяют условию, они добавляются к возвращаемому значению.Единственный аргумент, который вы передаете - это функция, которая будет вызываться для каждого элемента.Функция должна возвращать True или False для каждого члена массива.

Array.Some () похож, но вместо того, чтобы возвращать копию всех элементов, которые удовлетворяют условию, он будет проверять условие на каждомэлемент, и если любой возврат True, Array.Some () вернет True.Это сложный способ проверить, соответствуют ли какие-либо элементы вашему состоянию, например, гигантский блок ИЛИ.

students = [{
    batch_id: 22,
    id: 1,
    image: null,
    name: "a new batch student",
    attendance: [{
        id: 1,
        student_id: 1,
        batch_id: 22,
        absent_on: "2019-09-15",
        time: "09:26:23"
      },
      {
        id: 9,
        student_id: 1,
        batch_id: 22,
        absent_on: "2019-09-19",
        time: "00:00:00"
      }
    ]

  },
  {
    batch_id: 22,
    id: 2,
    image: null,
    name: "a new batch student",
    attendance: [{
      id: 9,
      student_id: 2,
      batch_id: 22,
      absent_on: "2019-09-19",
      time: "00:00:00"
    }]

  },
  {
    batch_id: 22,
    id: 12,
    image: null,
    name: "a new batch student",
    attendance: []

  }
]



// Return student if
//    student has an absence date
//       that matches this date
studentsAbsentOn = (students, date) => {
  return students.filter((student) => {
    return student.attendance.some((record) => {
      return record.absent_on === date
    });
  })
}

let absentStudents = studentsAbsentOn(students, "2019-09-19")
//returns the objects of both students absent on 2019-09-19

//Output to HTML
let studentNames = ""

for (let i = 0; i < absentStudents.length; i++) {
  studentNames += absentStudents[i].name;
  studentNames += ",\n"
}
document.getElementById("a").textContent += studentNames;
<p id="a"></p>
0 голосов
/ 19 сентября 2019

цель состоит в том, чтобы найти элемент «посещаемость» в каждом объекте учащегося и отфильтровать его, ключом к фильтрации являются входные данные, которые вы хотите.используя

  students[n].attendence.filter(data=> data.absent_on == INPUT)

для каждого учащегося

пример:

  var students = [{
  batch_id: 22,
  id: 1,
  image: null,
  name: "a new batch student",
    attendance: [
      { id: 1, student_id: 1, batch_id: 22, absent_on: "2019-09-15", time: "09:26:23" },
      { id: 9, student_id: 1, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }
    ]

},
{
  batch_id: 22,
  id: 2,
  image: null,
  name: "a new batch student",
    attendance: [
      { id: 9, student_id: 2, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }
    ]

},
{
  batch_id: 22,
  id: 12,
  image: null,
  name: "a new batch student",
    attendance: []

}];

var searchDate = "2019-09-19"

for (var i = 0 ; i <students.length;i++){
  students[i].attendance = students[i].attendance.filter( data => data.absent_on == searchDate );

}
0 голосов
/ 19 сентября 2019

Ответ:

Вы можете сделать filter данных ученика, которые разрешают любые данные, которые сообщают, что дата существует в записи о посещаемости, используя some.

  let searchAbsentDate = (data, date) => 
     data.filter(student => 
      student.attendance.some(record => 
        record.absent_on == date));

Пример:

let students=[{batch_id:22,id:1,image:null,name:"a new batch student",attendance:[{id:1,student_id:1,batch_id:22,absent_on:"2019-09-15",time:"09:26:23"},{id:9,student_id:1,batch_id:22,absent_on:"2019-09-19",time:"00:00:00"}]},{batch_id:22,id:2,image:null,name:"a new batch student",attendance:[{id:9,student_id:2,batch_id:22,absent_on:"2019-09-19",time:"00:00:00"}]},{batch_id:22,id:12,image:null,name:"a new batch student",attendance:[]}];

let searchAbsentDate = (data, date) => 
     data.filter(student => 
      student.attendance.some(record => 
        record.absent_on == date));

console.log( searchAbsentDate(students, "2019-09-19") );

Работа с проверкой:

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

function searchAbsentDate(data, date) {
// helper methods
   const isDateFormat = datestring => /\d{4}-\d{2}-\d{2}/.test(datestring),
   isNotString = s => !typeof s === "string",   
   noAttendance = student => !student.attendance || student.attendance.length === 0,
   invalidStudentAttendance = attendance => !Array.isArray(attendance),
   noAbsentDate = absentRecord => !absentRecord;

// determine date is in correct format
   if(isNotString(date) || !isDateFormat(date)) {
   throw Error("Improper Date Format");
   }
// determine data is array
   if(!Array.isArray(data)) { 
   throw Error("Student Records is not Array");
   }

// get results of filter
   let studentsAbsentOnDate = data.filter(function studentRecord(student, index) {

   // check if student has attendance records
     if(noAttendance(student)) return false;

   // determine if valid student record format
     if(invalidStudentAttendance(student.attendance)) { 
     throw Error(`Invalid Student Record Format At ${index}`);
    }
   // determine if student has absent date
     return student.attendance.some(function wasAbsentOnDate(record, _index) {

   // determine if valid attendance record format
     if(noAbsentDate(record.absent_on)) { 
       throw Error(`Invalid Attendance Record Format At Student:${index} Attendance Record:${_index}`);
     }
   // does attendance show absent on specified date
        return record.absent_on == date;
     });
   });
   // return any student records that match date
   return studentsAbsentOnDate;
}

Пример:

let students=[{batch_id:22,id:1,image:null,name:"a new batch student",attendance:[{id:1,student_id:1,batch_id:22,absent_on:"2019-09-15",time:"09:26:23"},{id:9,student_id:1,batch_id:22,absent_on:"2019-09-19",time:"00:00:00"}]},{batch_id:22,id:2,image:null,name:"a new batch student",attendance:[{id:9,student_id:2,batch_id:22,absent_on:"2019-09-19",time:"00:00:00"}]},{batch_id:22,id:12,image:null,name:"a new batch student",attendance:[]}];

function searchAbsentDate( data, date ) {
	const isDateFormat = datestring => /\d{4}-\d{2}-\d{2}/.test( datestring ),
		isNotString = s => !typeof s === "string",
		noAttendance = student => !student.attendance || student.attendance.length === 0,
		invalidStudentAttendance = attendance => !Array.isArray( attendance ),
		noAbsentDate = absentRecord => !absentRecord;
	if ( isNotString( date ) || !isDateFormat( date ) ) {
		throw Error( "Improper Date Format" );
	}
	if ( !Array.isArray( data ) ) {
		throw Error( "Student Records is not Array" );
	}
	let studentsAbsentOnDate = data.filter( function studentRecord( student, index ) {
		if ( noAttendance( student ) ) return false;
		if ( invalidStudentAttendance( student.attendance ) ) {
			throw Error( `Invalid Student Record Format At ${index}` );
		}
		return student.attendance.some( function wasAbsentOnDate( record, _index ) {
			if ( noAbsentDate( record.absent_on ) ) {
				throw Error( `Invalid Attendance Record Format At Student:${index} Attendance Record:${_index}` );
			}
			return record.absent_on == date;
		} );
	} );
	return studentsAbsentOnDate;
}
    
console.log( searchAbsentDate(students, "2019-09-19") );

Стиль альтернативного кода:

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

Это дает вам дополнительную гибкость в хранении этих частей отдельно для чистоты / повторного использования, если вы хотите, но цель состоит в том, чтобы упростить выполнение функции так, чтобы она была читаемой и легко поддерживать / изменять в будущем.

Я считаю этот стиль особенно полезным при работе с проектами, включающими Vue, React и другие библиотеки и инфраструктуры, ориентированные на состояние / рендеринг.

function searchAbsentDate( students, date ) {
    /*
       HELPER METHODS
    */
    const 
    // FORMAT CHECK-> date
        isDateFormat = datestring => /\d{4}-\d{2}-\d{2}/.test( datestring ),
        isNotString = s => !typeof s === "string",
        isNotDate = potentialDate => ( isNotString( potentialDate ) || !isDateFormat ),
    // FORMAT CHECK-> student
        noAttendanceRecords = student => !student.attendance || student.attendance.length === 0,
        invalidStudentAttendanceRecords = attendance => !Array.isArray( attendance ),
    // FORMAT CHECK-> attendance record
        noAbsentDate = absentDate => !absentDate,
    // DATA TRANSFORMS 
        forAllAttendanceRecords = ( attendanceRecords, index ) => checkFn => attendanceRecords.some( checkFn( index ) ),
        filterRecords = students => filterFn => students.filter( filterFn ),
    // FILTERS
        ifAbsentOnDate = date => index => ( record, _index ) => {
            if ( noAbsentDate( record.absent_on ) ) err.throwMissingDate( index, _index );
            return record.absent_on == date;
        },
        forAbsenceOnDate = ( student, studentIndex ) => {
            if ( noAttendanceRecords( student ) ) return false;
            if ( invalidStudentAttendanceRecords( student.attendance ) ) err.throwInvalidStudentRecord();
            return forAllAttendanceRecords( student.attendance, studentIndex )( ifAbsentOnDate( date ) );
        },
    // ERROR HANDLERS
    err = {
        throwMissingDate( stu_i, ar_i ) {
            throw Error( "Invalid Attendance Record Format At Student:" + stu_i + "Attendance Record:" + ar_i );
        },
        throwInvalidStudentRecord( index ) {
            throw Error( "Invalid Student Record Format At " + index );
        },
        throwStudentRecordsFormat() {
            throw Error( "Student Records is not Array" );
        },
        throwDateFormat() {
            throw Error( "Improper Date Format" );
        }
    };
    /* 
       EXECUTION
    */
    if ( isNotDate( date ) ) err.throwDateFormat();
    if ( !Array.isArray( students ) ) err.throwStudentRecordsFormat();
    return filterRecords( students )( forAbsenceOnDate );
}

Пример:

let students = [{ batch_id: 22, id: 1, image: null, name: "a new batch student", attendance: [{ id: 1, student_id: 1, batch_id: 22, absent_on: "2019-09-15", time: "09:26:23" }, { id: 9, student_id: 1, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }] }, { batch_id: 22, id: 2, image: null, name: "a new batch student", attendance: [{ id: 9, student_id: 2, batch_id: 22, absent_on: "2019-09-19", time: "00:00:00" }] }, { batch_id: 22, id: 12, image: null, name: "a new batch student", attendance: [] }];

function searchAbsentDate( students, date ) {
   
    const 
        isDateFormat = datestring => /\d{4}-\d{2}-\d{2}/.test( datestring ),
        isNotString = s => !typeof s === "string",
        isNotDate = potentialDate => ( isNotString( potentialDate ) || !isDateFormat ),
    
        noAttendanceRecords = student => !student.attendance || student.attendance.length === 0,
        invalidStudentAttendanceRecords = attendance => !Array.isArray( attendance ),
    
        noAbsentDate = absentDate => !absentDate,
    
        forAllAttendanceRecords = ( attendanceRecords, index ) => checkFn => attendanceRecords.some( checkFn( index ) ),
        filterRecords = students => filterFn => students.filter( filterFn ),
    
        ifAbsentOnDate = date => index => ( record, _index ) => {
            if ( noAbsentDate( record.absent_on ) ) err.throwMissingDate( index, _index );
            return record.absent_on == date;
        },
        forAbsenceOnDate = ( student, studentIndex ) => {
            if ( noAttendanceRecords( student ) ) return false;
            if ( invalidStudentAttendanceRecords( student.attendance ) ) err.throwInvalidStudentRecord();
            return forAllAttendanceRecords( student.attendance, studentIndex )( ifAbsentOnDate( date ) );
        },
    
    err = {
        throwMissingDate( stu_i, ar_i ) {
            throw Error( "Invalid Attendance Record Format At Student:" + stu_i + "Attendance Record:" + ar_i );
        },
        throwInvalidStudentRecord( index ) {
            throw Error( "Invalid Student Record Format At " + index );
        },
        throwStudentRecordsFormat() {
            throw Error( "Student Records is not Array" );
        },
        throwDateFormat() {
            throw Error( "Improper Date Format" );
        }
    };
   
    if ( isNotDate( date ) ) err.throwDateFormat();
    if ( !Array.isArray( students ) ) err.throwStudentRecordsFormat();
    return filterRecords( students )( forAbsenceOnDate );
}

console.log( searchAbsentDate( students, "2019-09-19" ) );

Вот так ...

Я знаю, я знаю. Я написал довольно длинный ответ на этот простой вопрос- Я склонен увлекаться!В любом случае, было ли все из этого полезным для вас, надеюсь, я смог хоть немного помочь!

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...