javascript - Array.splice 替换多个值(虽然设置为只替换一个)
问题描述
为了学习编码,我开始用 Javascript 和 HTML 制作我自己的小型 idle-clicker-RPG。现在我的库存管理代码让我很头疼,因为它不会以 1:1 的比例删除和添加项目,而是复制它们(见下文)。但我不知道为什么。当项目共享相同的“类型”时,它似乎只会发生(见代码)
我已经修剪了代码以找出在哪里。制作变量让,改变顺序和时间(添加settimeout),切断“拼接”功能并单独用于删除和添加。
HTML
<td><p><div id="Pos1" onclick="equip(Inventory[0], 0)"></div></td>
etc....
JavaScript
var Stick = {
Type : "MainHand",
};
var Knife = {
Type : "MainHand",
};
var Inventory = [];
var Equipped = {
MainHand : {Name : ""},
};
function equip(item, position){
let LItem = item;
let LPosition = position;
let EQItem = Equipped[LItem.Type]
if (EQItem.Name !== "") {
Inventory.splice(LPosition, 1, EQItem);
Object.assign(EQItem, LItem);
} else {
Object.assign(EQItem, LItem);
Inventory.splice(LPosition, 1);
};
};
当通过 html 在库存中压入物品时,我希望功能“装备”执行以下操作:
- 检查该地点是否尚未装备物品
1.1 从库存中删除选定的项目
1.2 将当前装备的物品添加到库存中
1.3 装备选定物品
- 如果未配备任何设备(2. 到 2.2 按预期工作)
2.1 从库存中删除选定的项目
2.2 装备选中物品
在 1.1-1.3 发生的情况是(我不确定顺序)选定的物品已装备,但未装备的物品(似乎已添加到库存中)和其他相同类型的物品随机更改为所选项目。这不会发生在所有相同类型的项目上——只有一些——但在更改足够多的时间后,所有相同类型的项目最终都会是相同的项目。
解决方案
看来您正在尝试一种面向对象的方法。
我不确定我是否完整地理解了您的问题。这是实现“设备”和“库存”的另一种方式。也许你喜欢它,它有帮助。
但要小心,这需要 ECMAScript 6(Babel 转译)。
class Mainhand {
static type() {
return "MainHand";
}
};
class Knife extends Mainhand {};
class Stick extends Mainhand {};
class Inventory {
constructor(items) {
this.items = items;
}
};
class Equipment {
constructor() {
this.equipped = {};
};
equip(item) {
let type = item.constructor.type();
// this one is used to create a new "equipped" list instead of modifing the previous one.
let newEquipment = Object.assign({}, this.equipped);
newEquipment[type] = item;
this.equipped = newEquipment;
}
};
document.user = {
inventory: new Inventory([
new Stick(),
new Knife(),
]),
equipment: new Equipment(),
};
document.querySelectorAll('.equip').forEach(function(button) {
button.addEventListener('click', function (e) {
e.preventDefault();
let item = document.user.inventory.items[e.target.dataset.inventoryKey];
document.user.equipment.equip(item);
let currentMainHandName = document.user.equipment.equipped.MainHand.constructor.name;
document.getElementById("currentMainHand").innerHTML = currentMainHandName;
});
});
<button class="equip" data-inventory-key="0">I want a stick</button>
<button class="equip" data-inventory-key="1">I want a knife</button>
<h2>Current Mainhand</h2>
<p id="currentMainHand" style="color: red;"></p>
推荐阅读
- c - 遇到换行符时对字符串进行标记 - 无法识别不工作的换行符
- c - 编译器一直显示错误:'inpu' 的参数 1 的类型不兼容
- php - 如何从 API 生成 url,其中数据每小时都在变化 PHP
- django - 使用 ManyToManyField 的基本标签系统
- r - 将固定宽度的数据集加载到 R 中,丢失一半的列
- python - 如何调用派生类方法?
- android - GeoFirestore:getAtLocation 未返回完整的文档列表
- android - android.security.KeyStoreException -62
- python - 试图做数学,int 对象是不可调用的
- javascript - 我希望能够存储和显示来自数组和本地存储内部的数据?