javascript 我想用一个字符串来过滤对象数组,该字符串应该与对象的属性键匹配,并且应该检查该键值

oipij1gg  于 2023-05-27  发布在  Java
关注(0)|答案(4)|浏览(87)

我有一个对象数组

const workSchedule = [
    {
        name: 'a',
        age: 21,
        workDays: {
            monday: {isavailable:true}, tuesday:{isavailable:false}, wednesday:{isavailable:true}, thursday:{isavailable:true}, Friday:{isavailable:false}
        }
    },
    {
        name: 'b',
        age: 22,
        workDays: {
            monday: {isavailable:false}, tuesday:{isavailable:false}, wednesday:{isavailable:true}, thursday:{isavailable:false}, Friday:{isavailable:false}
        }
    }
]

我有一个字符串变量,它有一个选定的日期

const day='Monday'

现在我想查一下A或B在星期一是否有空?

xdnvmnnf

xdnvmnnf1#

像这样试试

const workSchedule = [
    {
      name: "a",
      age: 21,
      workDays: {
        monday: { isavailable: true },
        tuesday: { isavailable: false },
        wednesday: { isavailable: true },
        thursday: { isavailable: true },
        friday: { isavailable: false },
      },
    },
    {
      name: "b",
      age: 22,
      workDays: {
        monday: { isavailable: false },
        tuesday: { isavailable: false },
        wednesday: { isavailable: true },
        thursday: { isavailable: false },
        friday: { isavailable: false },
      },
    },
  ];

  const day = "Monday";

  workSchedule.forEach((e) => {
    if (e.workDays[day.toLocaleLowerCase()]["isavailable"]) {
      console.log(e.name + " is available");
    } else {
      console.log(e.name + " is not available");
    }
  });
ma8fv8wu

ma8fv8wu2#

这里有一种方法可以实现你想要的,但是你应该尝试编写你到目前为止已经尝试过的代码来达到你的目标。
另外,要想在你的对象“星期五”的变量名称中保持一致,第一个字母是大写。
第一个代码段只是做你要求的事情,第二个代码段更可重用,可以从函数中访问availablePersons数组。

const workSchedule = [
          {
            name: 'a',
            age: 21,
            workDays: {
              monday: { isavailable: true },
              tuesday: { isavailable: false },
              wednesday: { isavailable: true },
              thursday: { isavailable: true },
              friday: { isavailable: false }
            }
          },
          {
            name: 'b',
            age: 22,
            workDays: {
              monday: { isavailable: false },
              tuesday: { isavailable: false },
              wednesday: { isavailable: true },
              thursday: { isavailable: false },
              friday: { isavailable: false }
            }
          }
        ];
        
        function getAvailablePersons(day){
            let lowercaseDay = day.toLowerCase();

            // Array to store available persons
            let availablePersons = [];

            workSchedule.forEach(person => {
              if (
                person.workDays &&
                person.workDays.hasOwnProperty(lowercaseDay) &&
                person.workDays[lowercaseDay].isavailable
              ) {
                availablePersons.push(person);
              }
            });

            // Display available persons
            console.log(`available persons on ${day}: (${availablePersons.length})`);
            availablePersons.forEach(person => {
              console.log(`- ${person.name}`);
            });
        }
        
        getAvailablePersons('Monday');
        getAvailablePersons('Wednesday');

这里有一个更好、更可重用的代码片段,你可以检索一个对象数组,它只包含可用的人,这样你就可以实现对这些人的其他搜索:

const workSchedule = [
          {
            name: 'a',
            age: 21,
            workDays: {
              monday: { isavailable: true },
              tuesday: { isavailable: false },
              wednesday: { isavailable: true },
              thursday: { isavailable: true },
              friday: { isavailable: false }
            }
          },
          {
            name: 'b',
            age: 22,
            workDays: {
              monday: { isavailable: false },
              tuesday: { isavailable: false },
              wednesday: { isavailable: true },
              thursday: { isavailable: false },
              friday: { isavailable: false }
            }
          }
        ];
        
        let availablePersons = [];
        let day = null;
        
        function getAvailablePersons(aDay){
            let lowercaseDay = aDay.toLowerCase();

            // Array to store available persons
            availablePersons = [];

            workSchedule.forEach(person => {
              if (
                person.workDays &&
                person.workDays.hasOwnProperty(lowercaseDay) &&
                person.workDays[lowercaseDay].isavailable
              ) {
                availablePersons.push(person);
              }
            });
            return availablePersons;
        }
        
        function listPersons(day){
            // Display available persons
            day = day.toLowerCase();
            console.log(`available persons on ${day}: (${availablePersons.length})`);
            availablePersons.forEach(person => {
              console.log(`- ${person.name}`);
            });
        }
        
        day = 'Monday';
        let personsOnMonday = getAvailablePersons(day);
        console.log(personsOnMonday);
        listPersons(day);
        
        day = 'Wednesday';
        let personsWednesday = getAvailablePersons(day);
        console.log(personsWednesday);
        listPersons(day);
pod7payv

pod7payv3#

你可以用filter方法来实现。

const day = 'monday';
        const workSchedule = [
        {
            name: 'a',
            age: 21,
            workDays: {
                monday: {isavailable:true}, tuesday:{isavailable:false}, wednesday:{isavailable:true}, thursday:{isavailable:true}, Friday:{isavailable:false}
            }
        },
        {
            name: 'b',
            age: 22,
            workDays: {
                monday: {isavailable:false}, tuesday:{isavailable:false}, wednesday:{isavailable:true}, thursday:{isavailable:false}, Friday:{isavailable:false}
            }
        }
    ];

    
const available = workSchedule.filter(sch=> sch.workDays[day.toLowerCase()].isavailable === true);

console.log(available[0]);
console.log(available[0].name);
bcs8qyzn

bcs8qyzn4#

首先,应该标准化输入数据,使其一致(例如,用friday代替Friday,用isAvailable代替isavailable)。
答案取决于您期望输出的数据类型。这将告知如何查询和操作数据。
这里有几个例子。
1.使用filtermap创建一个名称数组,我们可以将其分配给名为isAvailableOnMonday的变量。

const workSchedule=[{name:"a",age:21,workDays:{monday:{isAvailable:!0},tuesday:{isAvailable:!1},wednesday:{isAvailable:!0},thursday:{isAvailable:!0},friday:{isAvailable:!1}}},{name:"b",age:22,workDays:{monday:{isAvailable:!1},tuesday:{isAvailable:!1},wednesday:{isAvailable:!0},thursday:{isAvailable:!1},friday:{isAvailable:!1}}}];
const day = 'Monday';

// Accepts the data and day as arguments
function finder(data, day) {

  // For each object in the data...
  return data.filter(obj => {

    // Destructure `name` and `workDays` from the object
    const { name, workDays } = obj;

    // Check to see if that day is available (making sure you
    // render the day string to lower case)
    return workDays[day.toLowerCase()].isAvailable;

  // Finally `map` over the returned array of objects and
  // extract their names into a new array
  }).map(obj => obj.name);

}

const isAvailableOnMonday = finder(workSchedule, day);
console.log(isAvailableOnMonday);

1.在这个例子中,我们只是使用map来迭代数据对象,以返回一个新的对象数组,该数组描述了特定的一天isAvailable

const workSchedule=[{name:"a",age:21,workDays:{monday:{isAvailable:!0},tuesday:{isAvailable:!1},wednesday:{isAvailable:!0},thursday:{isAvailable:!0},friday:{isAvailable:!1}}},{name:"b",age:22,workDays:{monday:{isAvailable:!1},tuesday:{isAvailable:!1},wednesday:{isAvailable:!0},thursday:{isAvailable:!1},friday:{isAvailable:!1}}}];
const day = 'Monday';

// Accepts the data and day as arguments
function finder(data, day) {

  // For each object in the data...
  return data.map(obj => {

    // Destructure `name` and `workDays` from the object
    const { name, workDays } = obj;

    // Check to see if that day is available (making sure you
    // render the day string to lower case)
    const isAvailable = workDays[day.toLowerCase()].isAvailable;

    // Return a new object that specifies the name, day, and
    // availability as key/value pairs
    return { name, day, isAvailable };
  });
}

console.log(finder(workSchedule, day));

附加文件

1.在本例中,我们使用reduce创建一个对象,该对象将特定日期的人名放入isAvailable数组中。

const workSchedule=[{name:"a",age:21,workDays:{monday:{isAvailable:!0},tuesday:{isAvailable:!1},wednesday:{isAvailable:!0},thursday:{isAvailable:!0},friday:{isAvailable:!1}}},{name:"b",age:22,workDays:{monday:{isAvailable:!1},tuesday:{isAvailable:!1},wednesday:{isAvailable:!0},thursday:{isAvailable:!1},friday:{isAvailable:!1}}}];
const day = 'Monday';

// Accepts the data and day as arguments
function finder(data, day) {

  // For each object in the data...
  return data.reduce((acc, obj) => {

    // Destructure `name` and `workDays` from the object
    const { name, workDays } = obj;

    // Create an object key using the lowercase'd day value
    const key = day.toLowerCase();

    // Check to see if that day is available
    const { isAvailable } = workDays[key];

    // If the day doesn't exist as a key on the output object
    // add it and initialise it to an object with an empty
    // `isAvailable` array
    acc[key] ??= { isAvailable: [] };
    
    // The day _is_ available add the name to the `isAvailable`
    // array for that day
    if (isAvailable) acc[key].isAvailable.push(name);
    
    // Return the accumulator for the next iteration
    return acc;
  
  }, {});

}

console.log(finder(workSchedule, day));

相关问题