删除属性与创建新对象

时间:2016-07-26 08:27:00

标签: javascript performance

所以我有一个如下对象:

var data = [
    {
        unmatchedLines: [], //possible big array ~700+ lines per entry
        statusCode: 200,
        title: "title",
        message: "some message",
        details: [],
        objectDetails: []
    },
    {
        //same object here
    }
];

此数组由服务调用填充,然后循环以合并输出,然后将此结果发送回前端。

function convertResultToOneCsvOutput(data) {
    var outPutObject = {
        unmatchedLines: [],
        responses: []
    };
    for(var i = 0; i < data.length; i++) {
        if(data[i].fileData) {
           outPutObject.unmatchedLines = outPutObject.unmatchedLines.concat(data[i].fileData);
        }

        outPutObject.responses.push({
            statusCode: data[i].statusCode,
            title: data[i].title,
            message: data[i].message,
            details: data[i].details,
            objectDetails: data[i].objectDetails,
        })
    }

    return outPutObject;
};

现在我首先使用deleteunmatchedLines对象中删除data,以便代替创建一个全新的对象并将其推送到输出中做:

 delete data[i].unmatchedLines;
 outPutObject.responses.push(data[i]);

但后来我读到delete非常缓慢,偶然发现一条帖子说明将undefined放到delete而不是使用delete会更快。

我的问题:

最后使用什么更好? undefined,设置为jQuery(document).ready(function($){ console.log('ready'); $('#user_telephone').on('keypress',function(e){ console.log(e.which); if (e.which!=43 && e.which!=49 && e.which!=50 && e.which!=51 && e.which!=52 && e.which!=53 && e.which!=54 && e.which!=55 && e.which!=56 && e.which!=57 && e.which!=48 && e.which!=8){ e.preventDefault(); } }); 或创建一个新对象,就像我现在正在做的那样?

2 个答案:

答案 0 :(得分:7)

&#34;更好。&#34;

确实,当你delete来自一个对象的属性时,在许多现代引擎上将对象置于一个较慢的字典模式&#34;如果你没有从中删除属性,那意味着对该对象的后续属性查找(在你的情况下为data[i])将比delete之前更慢。因此,将属性设置为undefined(这不是完全相同的事情)可能适用于那些非常罕见情况,其中对象的属性访问速度很重要。

答案 1 :(得分:0)

可能是这样,但它确实取决于列表的长度,但是:

  

这两种技术之间的任何性能差异都将是   在任何典型案例中都是无法估量的。

more info about delete

无论如何:如果你真的需要额外的性能,你应该考虑处理克隆和不可变数据集(more info about immutable performances