javascript - 从对象的键数组中删除单个元素

标签 javascript arrays javascript-objects

我有一个有多个键的对象,每个键都有一个存储多个元素的数组。我希望能够从键的数组中删除指定的元素。

我尝试过使用 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/

相关文章:

javascript - jquery 显示/隐藏 div 下拉菜单不起作用

javascript - 如何指定从中加载字体的url?

javascript - 如何使用 JavaScript 检测是否一次按下多个键?

javascript - 为什么使用 "for...in"进行数组迭代是个坏主意?

c - 警告 : array subscript has type ‘char’ [-Wchar-subscripts]

javascript从带有对象的数组中获取字段

javascript - jQuery Plugin - 深度选项修改

javascript - 有人可以向我解释异步在这种 useEffect 场景中是如何工作的吗?

c# - 列表框转换为数组 int

Javascript嵌套对象过滤创建新对象