javascript - Javascript 中的扩展数组类:我应该如何创建辅助函数来修改数组而不分配新的引用?
问题描述
这是一个用于管理用户列表的 socket.io 大厅库。
我用自定义方法创建了一个 Array 扩展类。我的 removeUser 方法不起作用。日志显示,在方法内部,它确实有效 - 用户已被删除。在外面登录显示没有变化。
我相信我的问题是参考之一。index.js 'userList' 中的引用是一个引用。
var userList = require("./userList")();
但是,当我在方法中重新分配 userList 时,它会创建另一个引用。
userArray = result;
index.js 不知道这个新创建的引用,它看不到 userList 对象的变化。
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) 一个扩展的 Array 类,用于管理我大厅中的用户列表。
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;
}
解决方案
我的解决方案
我的解决方案是创建一个闭包。数组管理器对象包含用于管理 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;
推荐阅读
- yosys - How to add support for a new Lattice ice40 FPGA model into Yosys/Arachne-prn toolchain?
- node.js - Return Response After For loop in Node Js?
- python - 使用最近邻插值调整 1 通道 numpy(图像)数组的大小
- angular - Angular 12 and IE 11 production build error. TypeError: Object doesn't support this action
- java - Sending bulk sms to the phone number using REST API
- vue.js - Show images files using Vue.js
- google-tag-manager - ec.js 可以用服务器端 gtm 代理吗?
- drupal-8 - Drupal 仅在显示为页面但不在显示块中时提供选项卡菜单
- javascript - 坐标(纬度,语言)的任何地址?
- ruby - 在单例方法上使用 sorbet 接口抽象