Javascript 在数组上迭代时删除对象
我一直在尝试不同的方法,但没有一种有效,但这一种似乎是最简单的任务,即查找组(idGroup)内的条目,将它们包装到另一个数组(内部条目)中,并删除它所属数组外的条目Javascript 在数组上迭代时删除对象,javascript,arrays,object,underscore.js,Javascript,Arrays,Object,Underscore.js,我一直在尝试不同的方法,但没有一种有效,但这一种似乎是最简单的任务,即查找组(idGroup)内的条目,将它们包装到另一个数组(内部条目)中,并删除它所属数组外的条目 for(entry in entries) { if (entries[entry].idGroup) { var found = _.find(entries, function (num) { if(num.group == entries[entry].idGroup) { return num; } });
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');
}
}
}
这个脚本似乎是我尝试过的所有脚本中最简单的一个,但仍然不起作用;删除当前条目后,似乎会导致下划线库函数u.find在u.find所在行的u.find“TypeError:Cannot read property'group'of undefined”出错,如果删除delete运算符,则效果良好
这就是条目结构以前的样子
[
{
id: 0,
idGroup: 1,
data: "example"
},
{
id: 1,
idGroup: null,
data: "example"
},
{
id: 2,
idGroup: 1,
data: "example"
}
]
之后(应该如此)
或者更好,如果你喜欢的话
_.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]]]
的成员)转换为新对象(具有组:1
和条目:[Entry]
或原始条目,但使用扩展添加了id
字段)。这非常令人困惑。您能否向我们展示条目
包含的内容,并用几句话告诉我们预期的输出应该是什么?或者您到底想做什么?即使下划线不是函数库,修改当前正在迭代的列表也不太好。从u.groupBy开始,然后可能是每个或映射,怎么样?@istos解释得更好,抱歉。不完全确定您想要什么,但看看下划线提供的一些集合函数,例如并集、交集和差。@GruffBunny再次更新了它应该如何处理,抱歉,呵呵,也谢谢lossleader我会看一看,但如果你给我举个例子,我也会很感激。非常感谢!在接受答案之前,我先看看它是否工作正常。它工作得非常好!但是只有一个组,如果有一个条目的idGroup不是1,它将不会被添加到组数组中,请问您是否可以解决这个问题?嘿嘿,谢谢您的解释!我很抱歉,但实际上你能解决多组的问题吗?因为我主要问题中的脚本有这个能力。(我自己似乎也无法解决这个问题)我只是创建了另一个问题,因为您的答案中的代码存在某些问题,也因为我更好地组织了我的问题,以便它可能对其他人更有帮助。
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()