【问题标题】:JS/Lodash - replace values in multidimensional objectJS/Lodash - 替换多维对象中的值
【发布时间】:2018-12-12 23:22:39
【问题描述】:

我正在寻找一种有效的方法来使用 Lodash 甚至 vanilla JS 替换多维对象中的值。

我有一个包含未知深度的多维对象的数组,例如(简化)

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

现在我想用存储在单独对象中的命名导入引用替换每个节点的视图值。引用可以通过 view.id 作为这个对象的索引来访问。所以我想要实现的是这样的

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

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

我知道如何迭代多维对象以手动实现这一点,但由于我正在处理大型对象,如果使用 Lodash 有一种更清洁、更高效的方式会很好。

有人有天才的解决方案吗?

【问题讨论】:

    标签: javascript arrays json ecmascript-6 lodash


    【解决方案1】:

    由于 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);
      });
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用递归_.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>

      【讨论】:

        猜你喜欢
        • 2019-11-02
        • 2016-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多