簡體   English   中英

JS / Lodash-替換多維對象中的值

[英]JS/Lodash - replace values in multidimensional object

我正在尋找一種有效的方法來替換使用Lodash或什至普通JS的多維對象中的值。

我有一個數組,其中包含未知深度的多維對象,例如(簡化)

objects = [{
    id: 1,
    view: {
        id: 7
    }
}, {
    id: 2,
    view: {
        id: 9
    },
    childs: [{
        id: 3,
        view: {
            id: 3
        }
    }]
}];

現在,我想用存儲在單獨對象中的命名導入引用替換每個節點的view值。 這些引用可以通過view.id作為此對象的索引進行訪問。 所以我想要實現的是這樣的

views = {
    3: some,
    7: random,
    9: imports
};

objects = [{
    id: 1,
    view: views[7]
}, {
    ...
}];

好吧,我知道如何遍歷多維對象以手動實現此目的,但是由於我正在處理大型對象,因此,如果使用Lodash使用更干凈,更高效的方法,那就太好了。

有人有天才的解決方案嗎?

由於lodash只是用JS編寫的實用程序層,因此您不太可能通過使用它來獲得優於普通JS的性能提升。

下面的函數可能是最快的方法:它更改提供的對象而不是創建新的對象,並且不會遍歷每個鍵。

function transform(arr) {
  arr.forEach(obj => {
    if (obj.hasOwnProperty('view')) obj.view = views[obj.view.id];
    if (obj.hasOwnProperty('childs')) transform(obj.childs);
  });
}

您可以使用遞歸_.transform()調用來迭代和更新對象的視圖:

 const fn = o => _.transform(o, (acc, v, k) => { // if key is view, and it and has an id value replace it with equivalent from views if(_.eq(k, 'view') && _.has(v, 'id')) acc[k] = _.get(views, v.id, v); // if it's an object transform it recursively else if (_.isObject(v)) acc[k] = fn(v); // assign primitives to accumulator else acc[k] = v; }); const objects = [{"id":1,"view":{"id":7}},{"id":2,"view":{"id":9},"childs":[{"id":3,"view":{"id":3}}]}]; const views = { 3: 'some', 7: 'random', 9: 'imports' }; const result = fn(objects); console.log(result); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script> 

暫無
暫無

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

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