我正在使用一个以数组形式返回单值属性的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);
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);
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));
该错误是由于总是传输 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>