如果不在javascript中嵌套for循环,我如何解决这种情况


var selectedRows = gridOptions.api.getSelectedRows(); //this is an array
selectedRows.forEach(function(selectedRow, index) {
if (dataSampleAfterUpdate.length == 0) {
dataSampleAfterUpdate.push(selectedRow);
}
for (var x = 0; x < dataSampleAfterUpdate.length; x++) {
if (dataSampleAfterUpdate[x].Id == selectedRow.Id) {
dataSampleAfterUpdate[x] = selectedRow;
} else {
dataSampleAfterUpdate.push(selectedRow);
}
}
});

实际上,这个代码适用于10或20条记录。但如果有500条记录,页面就会挂起。有没有其他方法可以使用嵌套for循环?请帮助

您有一个O(n^2)复杂度算法。您可以在对象中跟踪访问过的项,而不是数组,因此可以在O(1)复杂度中进行查找,并且不需要内部for循环。

就我对您的代码的理解而言,您可能需要以下在O(n)时间内运行的简化代码:

var selectedRows = gridOptions.api.getSelectedRows(); //this is an array
var obj = Object.fromEntries(dataSampleAfterUpdate.map(e => [e.Id, e]));
selectedRows.forEach( function(selectedRow, index) {
obj[selectedRow.Id] = selectedRow;
});
dataSampleAfterUpdate = Object.values(obj);

这是对早期答案的改进:

var selectedRows = gridOptions.api.getSelectedRows(); //this is an array
var arr = [...dataSampleAfterUpdate, ...selectedRows];
var obj = Object.fromEntries(arr.map(e => [e.Id, e]));
dataSampleAfterUpdate = Object.values(obj);

这首先将两个阵列组合成一个单独的阵列CCD_ 4。然后通过按id对数组进行分组来创建一个对象,以删除重复项。通过设计,它将以前的值替换为下一个遇到的值。

为了更好地理解这一点,您可以展开并运行下面的代码片段。对各个步骤进行了说明。

var dataSampleAfterUpdate = [{Id: 1, Data: "a"}, {Id: 2, Data: "b"}, {Id: 3, Data: "c"}];
var selectedRows = [{Id: 2, Data: "bb"}, {Id: 4, Data: "dd"}];
// Combine the arrays into a nested array with eventual key value pairs (key = id).
var arr = [...dataSampleAfterUpdate, ...selectedRows];
console.log("Log 1:", JSON.stringify(arr));
// Converts into a nested array with eventual key value pairs (key = id).
var temp = arr.map(e => [e.Id, e]);
console.log("Log 2:", JSON.stringify(temp));

// Converts key value pair to object. Removes duplicate ids. By design object can only hold one value per key.
var obj = Object.fromEntries(temp);
console.log("Log 3:", JSON.stringify(obj));
// Converts back to array of values.
dataSampleAfterUpdate = Object.values(obj);
console.log("Log 4:", JSON.stringify(dataSampleAfterUpdate));

最新更新