Array中的Object Splicing没有给出正确的结果

时间:2014-11-05 10:52:49

标签: javascript lodash splice

在我的应用程序中,我希望在匹配时从数组中拼接对象,我使用lodash函数进行拼接,如下所示,遗憾的是json没有正确拼接,

Working Demo

任何人都可以就此问题给我一些建议

var arr = [{
    name: 'Jack',
    id: 125
}, {
    name: 'Jack',
    id: 125
}];

var result = _.without(arr, _.findWhere(arr, {name: 'Jack'}));
console.log(JSON.stringify(result));

预期结果

[]

实际结果

[{"name":"Jack","id":125}] 

更新1

即使使用普通的JavaScript方式也会提供相同的输出

for(var i = 0; i < arr.length; i++) {
    var obj = arr[i];

    if(obj.name === 'Jack') {
        arr.splice(i, 1);
    }
}

2 个答案:

答案 0 :(得分:1)

#1
var arr = [{
    name: 'Jack',
    id: 125
}, {
    name: 'Jack',
    id: 125
}];

var result = _.rest(arr, function (el) {
  return el.name === 'Jack';
});

console.log(JSON.stringify(result)); // "[]"

#2
var arr = [{
    name: 'Jack',
    id: 125
}, {
    name: 'Jack',
    id: 125
}, {
  name: 'foo',
  id: 124
}];

var result = _.rest(arr, function (e) {
  return e.name === 'Jack';
});

console.log(JSON.stringify(result)); // "[{\"name\":\"foo\",\"id\":124}]"

// 3 also you can use _.filter if you do not want slice of array... 

var result = _.filter(arr, function (e) {
  return e.name !== 'Jack';
});

console.log(JSON.stringify(result)); // "[{\"name\":\"foo\",\"id\":124}]"

答案 1 :(得分:1)

_.findWhere只返回第一个匹配的元素。这样你就可以使用_.difference和_.filter或_.rest来完成任务

_.difference(arr, _.filter(arr,function(d){ return d.name = 'Jack' }));

您可以使用以下代码使用纯JavaScript实现相同的功能。

for(var i = 0; i < arr.length; i++) {
    var obj = arr[i];
    if(obj.name === 'Jack') {
        arr.splice(i, 1); 
        i--; // Splicing of elements will cause shifting of indices in the array
    }
}