存储对象数组,然后检查上一个和下一个项目

Posted

技术标签:

【中文标题】存储对象数组,然后检查上一个和下一个项目【英文标题】:storing array of objects ang then check previous and next item 【发布时间】:2021-09-08 18:46:46 【问题描述】:

我应该能够为用户 A 和用户 B 添加输入,当我单击上一个时,它将显示上一个,当我单击下一个时,它将来回显示下一个输入。感谢您的帮助。

在我们点击下一步之后它会要求用户 A 输入,然后当我点击返回时它将要求用户 B 输入,它应该显示上一个用户的输入,如果我点击下一个,如果将显示下一个用户。

但是当我继续导航 next 和 prev 时,它不再显示数据。这家伙有什么问题?

//event.js
const showModal = document.querySelector("#showModal");
const modal = document.querySelector(".modal");
const nextBtn = document.querySelector("#next-btn");
const prevBtn = document.querySelector("#prev-btn");
let userText = document.querySelector(".user-text");

showModal.addEventListener("click", e => 
  modal.setAttribute("style", "display:block");
);

nextBtn.addEventListener("click", e => 
  userText.textContent = "User B";
  prevBtn.setAttribute("style", "display:inline-block");
);
prevBtn.addEventListener("click", e => 
  userText.textContent = "User A";
  prevBtn.setAttribute("style", "display:none");
);

//class.js
const mainForm = document.querySelector("#mainForm");
const fnameValue = document.querySelector("#fname");
const lnameValue = document.querySelector("#lname");
const idValue = document.querySelector("#idValue");

class User 
  constructor() 
    this.userArrHolder = [];
  
  addUser(id, fname, lname) 
    const newAddedUser = 
      id: id,
      fname: fname,
      lname: lname,
    ;

    if (this.userArrHolder.length > 0) 
      // displaying first user in ui
      this.userArrHolder.forEach(item => 
        idValue.value = item.id;
        fnameValue.value = item.fname;
        lnameValue.value = item.lname;
        console.log("display A");
      );

      // adding the second user
      this.userArrHolder.push(newAddedUser);
     else 
      // add new user
      this.userArrHolder.push(newAddedUser);
      fnameValue.value = "";
      lnameValue.value = "";
    
  
  // looping thru array
  displayUser(id) 
    idValue.value = id;
    this.userArrHolder.forEach((item, index) => 
      idValue.value = item.id;
      fnameValue.value = item.fname;
      lnameValue.value = item.lname;
    );
  


const newUser = new User();
mainForm.addEventListener("submit", e => 
  e.preventDefault();
  // validating if adding a user or display
  if (!idValue.value) 
    let id = Math.floor(Math.random() * 10000);
    newUser.addUser(id, fnameValue.value, lnameValue.value);
    console.log("add", newUser.userArrHolder);
   else 
    newUser.displayUser(idValue.value);
    console.log("display", newUser.userArrHolder);
  
);
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="index.css" />
    <title>Document</title>
  </head>
  <body>
    <div class="show-modal">
      <button id="showModal">Show Modal</button>
    </div>

    <div class="modal">
      <div class="modal-wrapper">
        <p class="user-text">User A</p>
        <form action="" id="mainForm">
          <label for="fname">First Name:</label><br />
          <input type="text" name="fname" id="fname" /><br />
          <label for="lname">Last Name:</label><br />
          <input type="text" name="lname" id="lname" />
          <div class="btn-container">
            <button
              type="submit"
              id="prev-btn"
              class="pr"
              style="display: none"
            >
              Prev
            </button>
            <button type="submit" id="next-btn">Next</button>
          </div>
          <input type="text" name="idValue" id="idValue" />
        </form>
      </div>
    </div>
  </body>
</html>

【问题讨论】:

你的&lt;script&gt;标签不应该是inside正文吗(右之前结束&lt;/body&gt;而不是之后 i> 它)? 什么意思? 在您的 HTML 文件中,&lt;script src="event.js"&gt;&lt;/script&gt;&lt;script src="class.js"&gt;&lt;/script&gt; 位于 结束 &lt;/body&gt; 标记之后;他们不应该是之前吗? 不,它正在工作,我要问的问题是逻辑上的 欢迎来到 Stack Overflow。你在哪里存储这个数组?当您转到 Next pr Previous item 时会发生什么?请提供一个最小的、可重现的示例:***.com/help/minimal-reproducible-example 【参考方案1】:

考虑以下示例(对 Dialog 使用 jQuery UI)

$(function() 
  var Users = [];
  var pos = 0;

  function showPrev() 
    pos--;
    showUser(Users[pos]);
    if (pos == 0) 
      $("#show-users ~ div.ui-dialog-buttonpane div.ui-dialog-buttonset button:eq(0)").addClass("hidden");
    
    if ($("#show-users ~ div.ui-dialog-buttonpane div.ui-dialog-buttonset button:eq(1)").hasClass("add-user")) 
      $("#show-users ~ div.ui-dialog-buttonpane div.ui-dialog-buttonset button:eq(1)").html("Next").removeClass("add-user ui-priority-primary");
    
  

  function showNext() 
    if ($("#show-users ~ div.ui-dialog-buttonpane div.ui-dialog-buttonset button:eq(1)").hasClass("add-user")) 
      addUser($("#fname").val(), $("#lname").val());
      showUser(Users[Users.length - 1]);
      pos = Users.length - 1;
      $("#show-users ~ div.ui-dialog-buttonpane div.ui-dialog-buttonset button:eq(1)").html("Next").removeClass("add-user ui-priority-primary");
     else 
      pos++;
      if (pos == Users.length) 
        showUser(
          fname: "",
          lname: "",
          id: ""
        );
        $("#show-users ~ div.ui-dialog-buttonpane div.ui-dialog-buttonset button:eq(1)").html("Add").addClass("add-user ui-priority-primary");
       else 
        showUser(Users[pos]);
      
    
    if (pos != 0) 
      $("#show-users ~ div.ui-dialog-buttonpane div.ui-dialog-buttonset button:eq(0)").removeClass("hidden");
    
  

  function newUser(fname, lname) 
    return 
      id: Math.floor(Math.random() * 10000),
      fname: fname,
      lname: lname
    ;
  

  function addUser(fname, lname) 
    Users.push(newUser(fname, lname));
  

  function showUser(data, $target) 
    $target = ($target != undefined ? $target : $("#show-users"));
    $("#fname", $target).val(data.fname);
    $("#lname", $target).val(data.lname);
    $("#idValue", $target).val(data.id);
  

  function makeTable(arr, $target) 
    $target = ($target != undefined ? $target : $("body"));
    var tbl = $("<table>", 
      class: "ui-widget ui-corner-all"
    ).css(
      width: "100%",
      borderCollapse: "collapse",
    );
    if ($target != false) 
      tbl.appendTo($target);
    
    if (arr.length == 0) 
      return tbl;
    
    var head = $("<thead>", 
      class: "ui-widget-header"
    ).appendTo(tbl);
    var body = $("<tbody>", 
      class: "ui-widget-content"
    ).appendTo(tbl);
    $("<tr>").appendTo(head);
    $("<th>").html("ID").appendTo($("tr", head));
    $("<th>").html("First Name").appendTo($("tr", head));
    $("<th>").html("Last Name").appendTo($("tr", head));
    $.each(arr, function(i, row) 
      $("<tr>").appendTo(body);
      $.each(row, function(k, v) 
        $("<td>", 
          class: "ui-widget-content"
        ).html(v).appendTo($("tr:last", body));
      );
    );
    $("tr", body).eq(pos).addClass("ui-priority-primary");
    return tbl;
  

  addUser("John", "Smith");
  addUser("Jane", "Smith");
  showUser(Users[pos]);

  $("#show-users").dialog(
    autoOpen: false,
    modal: true,
    buttons: [
        text: "Prev",
        class: (pos != 0 ? "" : "hidden"),
        click: showPrev
      ,
      
        text: "Next",
        click: showNext
      ,
      
        text: "Cancel",
        click: function() 
          $(this).dialog("close");
        
      
    ]
  );

  $("#showModal").click(function() 
    $("#show-users").dialog("open");
  );

  $("#showAll").click(function() 
    var dlg = $("<div>", 
      title: "All Users"
    ).html(makeTable(Users, false));
    dlg.dialog(
      modal: true,
      autoOpen: true,
      close: function() 
        $(this).dialog("destroy");
        dlg.remove();
      
    );
  );
);
#mainForm label,
#mainform input 
  display: block;
  margin-bottom: 3px;


.ui-dialog .ui-dialog-buttonset button.hidden 
  display: none;
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<div class="show-modal">
  <button id="showModal">Show Modal</button>
</div>
<div class="show-all">
  <button id="showAll">Show All Users</button>
</div>

<div class="modal" title="Show Users" id="show-users">
  <form action="" id="mainForm">
    <label for="fname">First Name:</label>
    <input type="text" name="fname" id="fname" />
    <label for="lname">Last Name:</label>
    <input type="text" name="lname" id="lname" />
    <input type="hidden" name="idValue" id="idValue" />
  </form>
</div>

如果您选择不使用 jQuery UI Dialog 窗口,其他功能和基本思想仍然适用。

您将拥有一个用户数组和一个指针或索引计数器,这将设置为0 或数组的特定索引。这些应该可用,以便您可以根据需要阅读或修改它们。然后,您将拥有各种功能来更新 UI 并根据用户交互修改数据。

Prev - 减少指针并显示数组中的上一个用户数据 不能低于0 索引 当指针为0 时隐藏上一个按钮 下一步 - 增加指针并显示数组中的下一个用户数据 不能超过最后一个索引 如果新用户条目超出最后一个索引,则清除表单 当指针不是0 时显示上一个按钮

【讨论】:

以上是关于存储对象数组,然后检查上一个和下一个项目的主要内容,如果未能解决你的问题,请参考以下文章

解析 iOS SDK:无法从数组中获取对象

如何检查对象数组中这些对象中的特定属性?反应

检查数组是不是包含某个对象

数组基础

从存储在 React 状态中的对象数组访问属性

检查对象数组中是不是存在具有特定键值的对象