![](/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.