JavaScript匹配数组和拼接但失败

时间:2016-11-23 18:12:35

标签: javascript arrays

我有list一组guid值,这些值与guid的{​​{1}}相匹配。

如果people的值为list,则下面的代码应该找到

'c7835c96-8dcc-b6e2-e452-494fe4d5fbc5'

并将其从数组{ 'guid': 'c7835c96-8dcc-b6e2-e452-494fe4d5fbc5', 'name': 'Stan Marsh' } 以及people中删除。

我遇到的问题是脚本似乎在第一个项目后停止,我无法弄清楚如何再次循环以删除list中的下一个项目。

jsFiddle Link

list

2 个答案:

答案 0 :(得分:1)

如果您只想删除与guid匹配的项目,可以使用 filter ,如下所示:

ButtonTwo

和其他数组类似:

Products.update({
  _id: product_id,
  'template.additionalFields': {
    $elemMatch: {
      _id: field._id
    }
  }
}, {
  $set: {
    'template.additionalFields.$.content': update
  }
});

Example

删除列表中包含的项目:

var guid =  'c7835c96-8dcc-b6e2-e452-494fe4d5fbc5';
var people = people.filter(function(item) {
    return item.guid !== guid;
})
console.log(people);

Example

答案 1 :(得分:0)

我建议将代码更改为以下内容:

list = list.filter(function(val) {
    var index = arrayObjectIndexOf(people, val, 'guid');
    if (index !== -1) {
        people.splice(index, 1);
    }
    return index == -1;
});

原始代码的问题在于,正如Zoltán评论的那样,它在迭代时修改了列表,所以在第二个 迭代,过滤函数决定它已经遍历了所有项目,因为它取决于项目[1],并且数组的长度现在只有1。

不需要手动修改列表,因为filter会返回一个包含回调项的新数组 返回true,所以我们只需要在 not 找到项目时返回true,并将过滤器的结果分配回列表。

另一个问题是即使找不到项目也会执行拼接(使用start参数调用splice将-1从数组中删除最后一项)。