繁体   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