【问题标题】:Cleanest way to loop over an array of objects and replace a property循环遍历对象数组并替换属性的最简洁方法
【发布时间】:2021-09-15 15:03:13
【问题描述】:

在循环可用座位时分配一个人的座位最干净的方法是什么,当分配一个人的座位后,电影票状态必须标记为不可用。也可以使用 lodash 方法。

const movieTickets = [
  {
    seat: "16B"
    status: "available"
  },
  {
    seat: "16c"
    status: "available"
  },
  {
    seat: "16D"
    status: "available"
  }
]

const people = [
   { 
     name: "Bob"
     seat: ""
   },
   { 
     name: "Susan"
     seat: ""
   },
   { 
     name: "Timmy"
     seat: ""
   }
]

/**
*  Current solution
* The problem is that ticket is not marked as unavailable, and I'm unsure of the cleanest way to do that, would love suggestions here
**/
 
const assignedPeople = people.map(person => {
  person.seat = movieTickets.find(ticket => ticket.status === "available").seat

  return person;
});

【问题讨论】:

    标签: javascript arrays loops


    【解决方案1】:

    使用相同的过程更新您的 movieTickets 数组。

    const movieTickets = [
      { seat: "16B", status: "available" },
      { seat: "16c", status: "available" },
      { seat: "16D", status: "available" }
    ];
    
    const people = [
      { name: "Bob", seat: "" },
      { name: "Susan", seat: "" },
      { name: "Timmy", seat: "" }
    ]
    const assignedPeople = people.map(person => {
      const node = movieTickets.find(ticket => ticket.status === "available");
      person.seat = node.seat;
      node.status = "unavailable";
      return person;
    });
    console.log(assignedPeople);
    console.log(movieTickets);

    如果你不想创建一个新数组,你可以更新原始数组本身。

    const movieTickets = [
      { seat: "16B", status: "available" },
      { seat: "16c", status: "available" },
      { seat: "16D", status: "available" }
    ];
    
    const people = [
      { name: "Bob", seat: "" },
      { name: "Susan", seat: "" },
      { name: "Timmy", seat: "" }
    ]
    people.forEach(person => {
      const node = movieTickets.find(ticket => ticket.status === "available");
      person.seat = node.seat;
      node.status = "unavailable";
    });
    console.log(people);
    console.log(movieTickets);

    【讨论】:

    • 笨蛋,没在我面前看到这个,谢谢!
    【解决方案2】:

    将找到的票分配给一个变量。然后,您可以在将座位分配给此人之前将其标记为不可用。

    此外,这还允许您检查是否找到了票。如果人数多于可用票,您的代码将出错,因为它会尝试访问 nullseat 属性。

    const movieTickets = [
      { seat: "16B", status: "available" },
      { seat: "16c", status: "available" },
      { seat: "16D", status: "available" }
    ];
    
    const people = [
      { name: "Bob", seat: "" },
      { name: "Susan", seat: "" },
      { name: "Timmy", seat: "" }
    ];
    
    const assignedPeople = people.map(person => {
      let ticket = movieTickets.find(ticket => ticket.status === "available");
      if (ticket) {
        ticket.status = "unavailable";
        person.seat = ticket.seat;
      }
      return person;
    });
    
    console.log(assignedPeople);

    【讨论】:

      【解决方案3】:

      您可以使用mapfind 轻松实现结果

      const movieTickets = [
        { seat: "16B", status: "available" },
        { seat: "16c", status: "available" },
        { seat: "16D", status: "available" }
      ];
      
      const people = [
        { name: "Bob", seat: "" },
        { name: "Susan", seat: "" },
        { name: "Timmy", seat: "" }
      ];
      
      const newPeopleData = people.map((p) => {
        const isSeatAvailable = movieTickets.find((o) => o.status === "available");
        if (isSeatAvailable) {
          isSeatAvailable.status = "unavailable";
          return { ...p, seat: isSeatAvailable.seat };
        }
        return p;
      });
      
      console.log(newPeopleData);
      console.log(movieTickets);
      /* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        猜你喜欢
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        • 1970-01-01
        • 2014-01-26
        • 2021-11-20
        • 1970-01-01
        相关资源
        最近更新 更多