【问题标题】:turning array into property value recursivly递归地将数组转换为属性值
【发布时间】:2020-08-30 04:21:38
【问题描述】:

我正在使用一个将单值属性作为数组返回的 api。我想拥有它,这样如果数组中只有 1 个值,则该值应该是一个字符串而不是字符串数组。

我在下面创建了 sn-p,但我得到“超出最大调用堆栈大小”显然我处于一个循环中,但我不太确定如何摆脱它。关于如何递归映射对象并完成我下面的示例有什么建议吗?

    const original = {
        a: ['foo'],
        b: ['bar'],
        c:{
            d:['baz'],
            e:['buzz'],
            f:{
                g:['zip'],
                h:['zap']
            }
        }
    };

    exampleResult = {
        a:"foo",
        b:"bar",
        c:{
            d:"baz",
            e:"buzz",
            f:{
                g:"zip",
                h:"zap"
            }
        }
    }

    function transformer(item){
        return _.transform(original, (r, v, k) => {

            if(typeof v ==="object"){
            transformer(v[0])
            }
            if(Array.isArray(v)){
            r[k] = v[0];  
            }
        });
    }
    let result = transformer(original)
    console.log(result);

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    const original = {
        a: ['foo'],
        b: ['bar'],
        c:{
            d:['baz'],
            e:['buzz'],
            f:{
                g:['zip'],
                h:['zap']
            }
        }
    };
    
    function transform(o) {
        const transformed = {};
        for (const [key, value] of Object.entries(o)) {
            transformed[key] = Array.isArray(value) ? value[0] : transform(value);
        }
        return transformed;
    }
    
    console.log(transform(original));

    【讨论】:

      【解决方案2】:
      function transform(item) {
          for (var key in item) {
              if (typeof item[key] === 'object') {
                  if (Array.isArray(item[key])) {
                      item[key] = item[key][0];
                  } else {
                      transform(item[key]);
                  }
              }
          }
          return item;
      }
      
      let result = transform(JSON.parse(JSON.stringify(original)));
      console.log(result);
      

      【讨论】:

        【解决方案3】:

        该错误是由于这里总是将original 转移到_.transform() 引起的:

        return _.transform(original, (r, v, k)
        

        递归的每个循环都返回到原始对象,然后重新开始。修复通行证item

        return _.transform(item, (r, v, k)
        

        你还需要修正你的逻辑。数组也是对象,因此您需要先检查数组。如果当前值是一个数组,并且它的长度是 1,则分配val 第一项。如果不是,请使用整个值。

        现在检查val 是否是一个对象,如果它是应用transformer

        const transformer = item =>
          _.transform(item, (r, v, k) => {
            // extract 1st item in case if an array with a single item     
            const val = _.isArray(v) && v.length === 1 ? v[0] : v;
            
            // check if the handle value is an object and transform accordingly
            r[k] = _.isObject(val) ? transformer(val) : val;
          });
        
        const original = {
          a: ['foo'],
          b: ['bar'],
          c: {
            d: ['baz'],
            e: ['buzz', 'nick', 'nack'],
            f: {
              g: ['zip'],
              h: ['zap']
            }
          }
        };
        
        const result = transformer(original);
        
        console.log(result);
        <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

        【讨论】:

          猜你喜欢
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-03
          • 1970-01-01
          • 2012-09-26
          • 1970-01-01
          • 2015-12-03
          • 1970-01-01
          相关资源
          最近更新 更多