递归地将数组转化为属性值。

问题描述 投票:1回答:1

我正在使用一个以数组形式返回单值属性的api。 我想让它在数组中只有一个值时,值应该是一个字符串而不是一个字符串数组。

我创建了下面的代码段,但我得到了 "最大调用堆栈大小超过",很明显,我是在一个循环中,但我不太确定如何突破它。有什么建议可以帮助我递归映射对象并完成下面的例子吗?

    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个回答
0
投票
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);

0
投票

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));

0
投票

该错误是由于总是传输 original_.transform() 这里。

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

递归的每个循环都会返回到原来的对象,然后重新开始。要固定传递 item:

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

你还需要修正你的逻辑。数组也是对象,所以你需要先检查数组。如果当前值是一个数组,并且它的长度是1,那么就赋给 val 第1项。如果没有,则使用整个值。

现在检查是否 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>
© www.soinside.com 2019 - 2024. All rights reserved.