Как я могу решить этот сценарий без вложенности l oop в javascript - PullRequest
0 голосов
/ 14 июля 2020
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 записях страница виснет. Есть ли альтернативный способ использования вложенности для l oop? Пожалуйста, помогите

Ответы [ 2 ]

2 голосов
/ 18 июля 2020

Вот усовершенствование предыдущего ответа:

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);

Сначала два массива объединяются в один массив arr. Затем создает объект, группируя массив по их идентификаторам, чтобы удалить дубликаты. По замыслу, оно заменяет предыдущие значения на следующее.

Чтобы лучше понять это, вы можете развернуть и запустить приведенный ниже фрагмент кода. Объясняются отдельные шаги.

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));
2 голосов
/ 14 июля 2020

У вас есть алгоритм O(n^2) сложности. Вместо массива вы можете отслеживать посещенные вами элементы в объекте, поэтому поиск может выполняться со сложностью O(1), а необходимость во внутреннем для l oop устраняется.

В меру насколько я понимаю ваш код, вам, вероятно, понадобится следующий упрощенный код, который выполняется за 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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...