我有一个具有多个键的对象,每个键都有一个存储多个元素的数组。我希望能够从键的数组中删除指定的元素。
我尝试使用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 {}
答案 0 :(得分:2)
我个人会重构一下您的代码,但是我已经解决了一些问题。
首先,您不应该在场景中使用delete
,因为它会使用默认值undefined
重置数组第n个位置的项目。
通常,对于这种类型的操作,由于您要处理字符串,因此您宁愿查看数组中项的首次出现,取其索引并使用 splice (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)即可从数组中实际删除该项目。
这样,您最终得到一个干净的数组,其中没有无效项。
下面是完成您所要求的工作代码(带有上述修复程序)。附带说明一下,我建议您避免为此目的而使用字符串,而宁愿使用唯一的 id 处理对象,以便在数组和对象之间跟踪它们非常容易。
此外,还有一些您未曾想到的情况,例如,我可以考虑通过提供无效的remove
来调用task
,因此您可以解决以下代码,处理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);
答案 1 :(得分:1)
您在正确的道路上。也许您在filter
上遇到的麻烦是因为filter
将返回一个新的Array而不修改当前的Array。您可以更新删除功能并替换以下行:
delete toDoList.capitalWeekday[task]
使用
toDoList.capitalWeekday = toDoList.capitalWeekday.filter((item) => {return item !== task});
答案 2 :(得分:1)
function remove(task, weekdayDue) {
let capitalWeekday = weekdayDue.charAt(0).toUpperCase() +
weekdayDue.slice(1);
// Assign new array with all elements but task
toDoList[capitalWeekday] = toDoList[capitalWeekday].filter(i => i !== task)
};
add('foo'...
add('bar'...
"{
"Baz": [
"Foo",
"Bar"
]
}"
remove('foo'...
"{
"Baz": [
"Bar"
]
}"