[英]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.