在数组上迭代时删除对象

deleting a object while iterating over array

本文关键字:删除 对象 迭代 数组      更新时间:2023-09-26

我一直在尝试不同的方法,但它们都不起作用,但这似乎是最简单的任务,即找到一个组(idGroup)内的条目,将它们封装到另一个数组(内部条目)中,并删除其所属数组外的条目

for(entry in entries) {
if (entries[entry].idGroup) {
    var found = _.find(entries, function (num) { if(num.group == entries[entry].idGroup) { return num; } });
    if(found) {
        entries[_.indexOf(entries, found)].entries.push(entries[entry]);
        delete entries[entry];
        console.log('pushed');
    }else{
        entries.splice(entry,0, { group: entries[entry].idGroup, entries: [entries[entry]] });
        delete entries[entry];
        console.log('created');
    }
}
}

这个脚本似乎是我尝试过的最简单的,但它仍然不起作用;删除当前条目后,似乎会导致下划线库函数_.find出现错误。find所在的行"TypeError:无法读取未定义的属性'group'",如果我删除delete运算符,它会正常工作。

这就是条目STRUCTURE在之前的样子

[
  {
    id: 0,
    idGroup: 1,
    data: "example"
  },
  {
    id: 1,
    idGroup: null,
    data: "example"
  },
  {
    id: 2,
    idGroup: 1,
    data: "example"
 }
]

以及之后(应该如此)

[
  {
    id: 0,
    group: 1,
    entries: [
     {
       id: 0,
       idGroup: 1,
       data: "example"
     },
     {
       id: 2,
       idGroup: 1,
       data: "example"
     }
    ]
  },
  {
    id: 1,
    idGroup: null,
    data: "example"
 }
]
arr = [
  {
    id: 0,
    idGroup: 1,
    data: "example"
  },
  {
    id: 1,
    idGroup: null,
    data: "example"
  },
  {
    id: 2,
    idGroup: 1,
    data: "example"
 }
];
b = _.groupBy(arr, function(a) {return a.idGroup; });
c = _.toArray(b);
d = _.map(c, function(es, i) { return (es.length > 1) ? {id: i, group: 1 , entries: es} : _.extend({id: i}, es[0]) });

如果你喜欢,那就更好了

_.chain(arr)
  .groupBy(function(a) {return a.idGroup; })
  .toArray()
  .map(function(es, i) { 
    return (es.length > 1) ? {id: i, group: 1 , entries: es} : _.extend({id: i}, es[0]); 
  })
  .value()

groupBy将原始条目数组转换为一个对象,该对象的键为idGroup,值为符合条件的条目数组。

toArray将新对象转换为条目数组:([[Entry]]

map将条目([Entry])的每个数组(即[[Entry]]的成员)转换为新对象(具有group: 1entries: [Entry]或原始条目,但使用extend添加了id字段)。