我有一个有多个键的对象,每个键都有一个存储多个元素的数组。我希望能够从键的数组中删除指定的元素。
我尝试过使用 delete 关键字以及 filter 方法,但都没有成功。我是 JS 的新手,所以我很感激任何帮助。另外,我想只使用 JavaScript,不使用库。
这是我创建对象的代码:
function add(task, weekdayDue) {
let capitalWeekday = weekdayDue.charAt(0).toUpperCase() +
weekdayDue.slice(1);
if (toDoList[capitalWeekday] === undefined) {
let subArr = [];
toDoList[capitalWeekday] = subArr.concat(task);
} else {
toDoList[capitalWeekday].push(task);
}
}
这是我现在拥有的代码。显然它没有产生正确的结果:
function remove(task, weekdayDue) {
let capitalWeekday = weekdayDue.charAt(0).toUpperCase() +
weekdayDue.slice(1);
delete toDoList.capitalWeekday[task]
//the below code is working; i want to send this to another
array
if (archivedList[capitalWeekday] === undefined) {
let subArr = [];
archivedList[capitalWeekday] = subArr.concat(task);
} else {
archivedList[capitalWeekday].push(task);
}
};
add('laundry', 'monday');
add('wash car', 'monday');
add ('vacuum', 'tuesday');
add('run errands', 'wednesday');
add('grocery shopping', 'wednesday');
// the output is: { Monday: [ 'laundry', 'wash car' ],
Tuesday: [ 'vacuum' ],
Wednesday: [ 'run errands', 'grocery shopping' ] }
然后假设我想从我正在尝试的星期一删除“洗车”:
remove('wash car', 'monday');
console.log(toDoList)
// The output is an empty object {}
最佳答案
我个人会重构一些您的代码,但我已经围绕它做了一些工作以解决一些问题。
首先,您不应该在您的场景中使用delete
,因为它会将数组第 n 个位置的项目重置为默认值,即 undefined
。
通常,对于这种操作,由于您处理的是字符串,您宁愿查看您的项目在数组中的第一次出现,获取它的索引,然后使用拼接> ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice ) 实际从数组中删除该项目。
通过这种方式,您最终会得到一个干净的数组,其中没有无效的项目。
下面是执行您要求的工作代码(带有提到的修复程序)。作为旁注,我建议您避免出于此类目的使用字符串,但我宁愿处理具有唯一 id 的对象,这样在数组和对象之间跟踪它们会容易得多。
此外,还有一些你没有想到的情况,例如我可以考虑通过给出一个无效的task
来调用remove
,所以你可能会工作绕过下面的代码来处理 taskIndex
为 -1 的情况(意味着没有找到具有该索引的项目)。
var toDoList = {}, archivedList = {};
function add(task, weekdayDue) {
let capitalWeekday = weekdayDue.charAt(0).toUpperCase() + weekdayDue.slice(1);
if (toDoList[capitalWeekday] === undefined) {
let subArr = [];
toDoList[capitalWeekday] = subArr.concat(task);
} else {
toDoList[capitalWeekday].push(task);
}
}
function remove(task, weekdayDue) {
let capitalWeekday = weekdayDue.charAt(0).toUpperCase() + weekdayDue.slice(1);
let taskIndex = toDoList[capitalWeekday].indexOf(task);
toDoList[capitalWeekday].splice(taskIndex, 1);
//delete toDoList[capitalWeekday][taskIndex];
if (archivedList[capitalWeekday] === undefined) {
let subArr = [];
archivedList[capitalWeekday] = subArr.concat(task);
} else {
archivedList[capitalWeekday].push(task);
}
};
add('test', 'monday');
add('wash car', 'monday');
remove('wash car', 'monday');
console.log(toDoList);
console.log(archivedList);
关于javascript - 从对象的键数组中删除单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56104363/