Javascript 使用java脚本从对象中删除项的更好方法是什么
我有50000行和200列(每行上),试图从每行对象中删除所有col对象,现在完成整个过程需要5秒钟。有没有更好的方法来提高性能? 注意:可能会跳过某些对象,在这种情况下,不要删除SkipRous和skipCols对象Javascript 使用java脚本从对象中删除项的更好方法是什么,javascript,performance,javascript-objects,Javascript,Performance,Javascript Objects,我有50000行和200列(每行上),试图从每行对象中删除所有col对象,现在完成整个过程需要5秒钟。有没有更好的方法来提高性能? 注意:可能会跳过某些对象,在这种情况下,不要删除SkipRous和skipCols对象 var skipRows = {10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1}; var skipCols = {50:1,51:1,52:1,53:1,54:1,55:1,56:1,57:1,58:1,59:1,6
var skipRows = {10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1};
var skipCols = {50:1,51:1,52:1,53:1,54:1,55:1,56:1,57:1,58:1,59:1,60:1};
for(var i = 0; i < 50000; i++){
if(!(i in skipRows)){
var rowObject = rowColObjects[i];
for ( var j = 0; j < 200; j++){
if(!(j in skipCols)){
delete rowObject[i+"-"+j];
}
}
}
var skipRows={10:1,11:1,12:1,13:1,14:1,15:1,16:1,17:1,18:1,19:1,20:1};
var skipCols={50:1,51:1,52:1,53:1,54:1,55:1,56:1,57:1,58:1,59:1,60:1};
对于(变量i=0;i<50000;i++){
如果(!(我在船头){
var rowObject=rowColObjects[i];
对于(var j=0;j<200;j++){
如果(!(skipCols中的j)){
删除行对象[i+“-”+j];
}
}
}
}
下面是查看示例代码和结果的提琴:
谢谢,
Rambau.为什么不重新初始化它,而不是遍历所有键并删除它们
rowColObjects={}代码>
如果要跳过某些对象的删除,请参见此处的性能
for(var i = 0; i < 50000; i++){
var rowObject = rowColObjects[i];
if (condition)
{
rowObject = {};
}
}
for(变量i=0;i<50000;i++){
var rowObject=rowColObjects[i];
如果(条件)
{
rowObject={};
}
}
在我的浏览器(当前最新的Firefox)中,您的原始代码耗时约14秒。然后,我尝试使用我的代码,大约需要6秒。至少,我的代码提高了执行时间
const newObj = Object.keys(rowColObjects)
.reduce((acc, row) => {
acc[row] = {
id: rowColObjects[row].id,
name: rowColObjects[row].name,
...Object.keys(rowColObjects[row])
.slice(2)
.reduce((acc2, col, i) => {
if (i % 2 !== 0) acc2[col] = rowColObjects[row][col];
return acc2;
}, {})
};
return acc;
}
, {});
另一种方法是将剩余id存储在另一个变量中
const newObj = Object.keys(rowColObjects)
.reduce((acc, row) => {
acc[rowColObjects[row].id] = Object.keys(rowColObjects[row])
.slice(2)
.filter((_, i) => i % 2 !== 0);
return acc;
}, {});
它超快。只花了大约2秒钟。然后,您可以创建一个机制来将剩余的项存储回对象。根据您的描述,rowColObjects=[]
应该可以正常工作。@georg您的意思是rowColObjects={}
?我是说var rowColObjects={};添加对象的示例代码:var rowColObjects={};for(var i=0;i<50000;i++){var rowObjects={id:i,name:“rowObject”+i};for(var j=0;j<200;j++){rowObjects[i+“-”+j]={id:j,name:“coloobject”+j};}rowColObjects[i]=rowObjects;}因为您迭代了对象的50000
元素,所以花了5秒钟。@georg感谢您的回答,但我想跳过一些对象以执行删除操作。我们需要放置条件删除列对象,正确更新问题。删除对象之前有一个条件。谢谢您,你能在下面的提琴中更新吗?skiprows和skipCols将动态变化,我正在使用chrome和IET谢谢大家,这个问题是通过只添加必需的对象而不是删除所有对象来解决的。以下是JSFIDLE:
Object.keys(rowColObjects).forEach(key => {
const rowObject = rowColObjects[key]
Object.keys(rowObject).forEach(colKey => {
if(!['id', 'name'].includes(colKey)) {
delete rowObject[colKey]
}
})
})