簡體   English   中英

Javascript 中的擴展數組 Class:我應該如何創建輔助函數來修改數組而不分配新的引用?

[英]Extended Array Class in Javascript: How should I create helper functions to modify Array without assigning a new reference?

這是一個用於管理用戶列表的 socket.io 大廳庫。
我使用自定義方法創建了一個數組擴展 class。 我的 removeUser 方法不起作用。 日志顯示,在方法內部,它確實有效 - 用戶已被刪除。 在外面登錄顯示沒有變化。

我相信我的問題是參考之一。 index.js 'userList' 中的引用是一個引用。
var userList = require("./userList")();
但是,當我在方法中重新分配 userList 時,它會創建另一個引用。
userArray = result;
index.js 不知道這個新創建的引用,它在 userList object 中看不到任何變化。

index.js我的服務器(簡化例如)

const express = require("express");
const bodyParser = require("body-parser");
const app = express();

const server = require("http").createServer(app);
const io = require("socket.io")(server);

var userList = require("./userList")();

io.on("connection", (socket) => {
  // get user from session
  userList.addUser(s_user);
  socket.on("disconnect", () => {
    userList.removeUser(s_user);
  });
});

userList.js (Original) 一個擴展數組 class 用於管理我大廳中的用戶列表。

function createUserList() {
  
  let userArray = [];

  userArray.addUser = (user) => {
    userArray.push(user);
  };

  userArray.removeUser = (user) => {
    let userId = user.user_id;
    for (let i = 0; i < userArray.length; i++) {
      if (userArray[i]["user_id"] === userId && userId !== undefined) {
        let firstHalf = userArray.slice(0, i);
        let secondHalf = userArray.slice(i+1, userArray.length);
        let result = firstHalf.concat(secondHalf);
        userArray = result;
      }
    }
  };

  return userArray;
}

我的解決方案
我的解決方案是創建一個閉包。 數組管理器 object 包含管理 userList 的方法,並通過閉包訪問 userArray。 (本段下方的代碼)
優點

  • userArray 可以在沒有參考問題的情況下修改或重新分配(在 userList 庫中)
    userArray = [] //ok
    (我也不必在重新分配時重新附加方法)

缺點

  • 我不能使用數組原型方法
    let length = userList.length // method doesn't exist on management object
    let listCopy = userList // returns an object, not the list
    我必須使用我的自定義構建方法
    let length = userList.getLength()
    let listCopy = userList.getList()

有沒有人有其他有趣的解決方案?

用戶列表.js (V2)

function createUserList() {

  let userArray = []

  let arrayManager = {

    addUser: (user) => {
      userArray.push(user);
    },

    removeUser: (user) => {
      let userId = user.user_id;
      for (let i = 0; i < userArray.length; i++) {
        if (userArray[i]["user_id"] === userId && userId !== undefined) {
          let firstHalf = userArray.slice(0, i);
          let secondHalf = userArray.slice(i+1, userArray.length);
          let result = firstHalf.concat(secondHalf);
          userArray = result;
        }
      }
    },

    getList: () => {
      return userArray;
    },

    getLength: () => {
      return userArray.length;
    }
  };

  return arrayManager;
}

module.exports = createUserList;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM