我有以下对象:
{ name: ["Jimmy","Jill"], age: [23, 42], location: { city: ["LA", "NYC"] }
对于每个对象键,都有一个包含2个条目的数组值(总是)。我想要做的是通过拔出数组中的第二项来重新创建对象。但我希望这是递归发生的。所以输出将是:
{ name: "Jill", age: 42, location: { city: "NYC" }
我尝试使用Object.keys()
迭代对象,但这似乎不会给我嵌套键。我想知道是否有更优雅的方法来解决这个问题?
非常感谢提前。
答案 0 :(得分:1)
这被认为没问题吗?这只有在我们假设每个prop都是普通Object的数组时才有效。
let o = { name: ["Jimmy","Jill"], age: [23, 42], location: { city: ["LA", "NY"] }}
function rec(obj) {
for (let key in obj) {
if (obj[key] instanceof Array) {
obj[key] = obj[key][1]
} else {
obj[key] = rec(obj[key])
}
}
return obj
}
rec(o)
console.dir(o)

甚至是这个? (允许存在包含对象和普通原始条目的数组)
let o = {
primitive: 10,
name: ["Jimmy","Jill"],
age: [23, 42],
location: {
city: ["LA", "NY"],
test: [
{prop1: ['1', '2']},
{prop2: ['A', 'B']}
]
}
}
function rec(obj) {
if (obj instanceof Array) {
return rec(obj[1])
} else if (obj instanceof Object) {
for (let key in obj) {
obj[key] = rec(obj[key])
}
return obj
} else {
return obj
}
}
rec(o)
console.dir(o)

答案 1 :(得分:1)
在解析过程中可能更容易过滤:
j = '{ "name": ["Jimmy","Jill"], "age": [23, 42], "location": { "city": ["LA", "NYC"] }}'
o = JSON.parse(j, (k, v) => v.constructor === Array ? v.pop() : v)
console.log( o )
答案 2 :(得分:0)
晚会,但这是一个“功能”选项需要考虑。需要进行修改以适应任何边缘情况。
const reducer = input =>
Object.entries(input).reduce(
(acc, [key, value]) =>
value instanceof Array ? { ...acc, ...{ [key]: value[1] } } : { ...acc, ...reducer(value) },
{}
);
const input = { name: ["Jimmy", "Jill"], age: [23, 42], location: { city: ["LA", "NYC"] } };
const reduced = reducer(input);
console.log(reduced); // Output: { name: 'Jill', age: 42, city: 'NYC' }