![](/img/trans.png)
[英]Javascript: How to modify each element in array without changing the reference
[英]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 = [] //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.