簡體   English   中英

如何更有效地修改 Javascript 中的鍵/值的多維數組?

[英]How to modify a multidimensional array with keys/values in Javascript more efficiently?

我會切入正題。

我想更改以下數組中特定 ID 和 dataID 的半徑值:

var data = [{
  ID: 0,
  type: 'circle',
  Name: 'Tom',
  MoreData: [{
    dataID: 123,
    dimData: {
      radius: 25,
      var: 15
    }
  }, {
    dataID: 345,
    dimData: {
      radius: 35,
      var: 65
    }
  }]
}, {
  ID: 1,
  type: 'circle',
  Name: 'Mat',
  MoreData: [{
    dataID: 678,
    dimData: {
      radius: 40,
      var: 30
    }
  }, {
    dataID: 91011,
    dimData: {
      radius: 50,
      var: 50
    }
  }]
}];

我目前的解決方案:

 var data = [{ ID: 0, type: 'circle', Name: 'Tom', MoreData: [{ dataID: 123, dimData: { radius: 25, var: 15 } }, { dataID: 345, dimData: { radius: 35, var: 65 } }] }, { ID: 1, type: 'circle', Name: 'Mat', MoreData: [{ dataID: 678, dimData: { radius: 40, var: 30 } }, { dataID: 91011, dimData: { radius: 50, var: 50 } }] }]; var doSomething = function(array, IDVal, dataIDVal, RadiusVal) { //Search array for ID and then dataID and then set the value of that dataID's Radius to RadiusVal for (var i = 0; i < array.length; i++) { if (array[i].ID == IDVal) { for (var j = 0; j < array[i].MoreData.length; j++) { if (array[i].MoreData[j].dataID == dataIDVal) { console.log('Radius Before: ' + array[i].MoreData[j].dimData.radius); array[i].MoreData[j].dimData.radius = 20000; console.log('Radius After: ' + array[i].MoreData[j].dimData.radius); } } } } } doSomething(data, 0, 345, 100); console.log(data[0]);

我想先搜索正確的ID,然后獲取正確的dataID來更改dimData.Radius。

有沒有更有效的方法來做到這一點? 不用說,數據數組可以非常大,而且 MoreData 數組還包含更多值(dimData 也是如此)。 我想知道是否有更快的方法來實現上述結果。

編輯:要回答幾個問題,唯一可以保證的是 ID 值始終是結構化的,因此它每次都遞增 1,但我不相信數據會以其他方式排序。 但是,假設數據集也已排序,我將不勝感激。

編輯 2:嘗試使用.filter 的解決方案,但最終有幾個函數相互嵌套,看起來很混亂。

如果有人想要這個解決方案,它在這里: 如何在 Javascript.filter() 方法中將額外的參數傳遞給回調 function?

如果代碼片段不起作用(我是新手),請在 JS Fiddle 上鏈接: https://jsfiddle.net/53pa2xst/

就時間復雜度而言,使用嵌套循環非常昂貴 O(n^2) 更好的方法是像這樣將其簡單地轉換為 O(n)

 var data = [{ ID: 0, type: 'circle', Name: 'Tom', MoreData: [{ dataID: 123, dimData: { radius: 25, var: 15 } }, { dataID: 345, dimData: { radius: 35, var: 65 } }] }, { ID: 1, type: 'circle', Name: 'Mat', MoreData: [{ dataID: 678, dimData: { radius: 40, var: 30 } }, { dataID: 91011, dimData: { radius: 50, var: 50 } }] }]; var doSomething = function (array, IDVal, dataIDVal, RadiusVal) { let list = {}; array.map((ar, pos) => { list[ar.ID] = pos; }) console.log("before: ", array[0].MoreData) array[list[IDVal]].MoreData.filter(a => a.dataID == dataIDVal)[0].dimData.radius = 20000; console.log("After: ", array[0].MoreData) } doSomething(data, 0, 345, 100);

您可能會考慮添加一些驗證器來檢查 Id 是否存在。

我不確定您的數組必須達到什么大小才能讓您在過濾數組時注意到速度變慢,因此您實際上可能不需要其他結構。

據我所知, Array.prototype.filter將是 O(n)。 如果您對data所做的所有事情都是查找值,那么將其轉換為哈希映射/對象會更高效——更符合 O(1) 的要求。

例如

var data = {
  0: {
    type: 'circle',
    Name: 'Tom',
    MoreData: {
      123: {
        dimData: {
          radius: 25,
          var: 15
        }
      }, {
      345: {
        dimData: {
          radius: 35,
          var: 65
        }
      }
    }      
  }

在您的搜索 function 中,您可以訪問如下結構

let shape = data[IdVal]
let moreData = shape[dataIdVal]
let radius = moreData['radius']

是否只使用這種結構完全取決於您的訪問模式。 如果您仍然只是根據它們的 ID 選擇我們的某些元素,那么這將是一個更有效的選擇。 但是,如果您在整個結構中進行過濾/搜索或進行任何聚合工作,那么使用基於數組的結構和過濾可能會更好。 (如果您有興趣查找“平衡二叉樹”或“陷阱”作為另一種潛在的解決方案)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM