JavaScript - 如何确保数组操作在函数内是持久的?

时间:2017-11-16 09:54:12

标签: javascript arrays reference ecmascript-5

我正在尝试编写一个JavaScript函数(ES5),它将接收一个数组,对其进行过滤,并将原始数组设置为新数组。

这是我的插件:https://plnkr.co/edit/OWeOjJ3SLVGYRaweyy3Z

这是我想要做的基本伪代码:

var result = [{ 'date': '20171116' }, { 'date': '20171115' }];
var data = { 'date': '2017116' };
deleteEntry(data, result);
console.log(result); //should  have one entry

function deleteEntry(data, result) {
  result = result.filter(function(item) {
    return item.date !== data.date;
  });
}

我认为这个问题与数组引用有关。我不知道如何完成任务。

3 个答案:

答案 0 :(得分:2)

您应该返回已修改的数组并将其分配给result变量:

function deleteEntry(data, result) {
  return result.filter(function(item) {
    return item.date !== data.date;
  });
}

result = deleteEntry(data, result);

答案 1 :(得分:1)

Array.filter返回一个新的数组实例,这样当你执行 result = result.filter(...)时就会丢失原始数组的引用。您可以改为使用array.splice:

var result = [{ 'date': '20171116' }, { 'date': '20171115' }];
var data = { 'date': '20171116' };
deleteEntry(data, result);
function deleteEntry(data, result) {
    var index = result.findIndex(item => item.date === data.date);
    result.splice(index, 1);
}
console.log(result);

答案 2 :(得分:0)

您可以使用Array#splice删除所有元素并添加新的过滤元素。



function deleteEntry(data, result) {
    Array.prototype.splice.apply(result, [0, result.length].concat(result.filter(function(item) {
        return item.date !== data.date;
    })));
}

var result = [{ date: '20171116' }, { date: '20171115' }],
    data = { date: '20171116' };
    
deleteEntry(data, result);
console.log(result);




ES6



function deleteEntry(data, result) {
    var temp = result.filter(item => item.date !== data.date);
    result.length = 0;
    result.push(...temp);
}

var result = [{ date: '20171116' }, { date: '20171115' }],
    data = { date: '20171116' };
    
deleteEntry(data, result);
console.log(result);