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

时间:2019-05-12 23:46:04

标签: 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 {}

3 个答案:

答案 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"
  ]
}"