在javascript对象中递归删除数组

时间:2018-03-15 00:09:19

标签: javascript

我有以下对象:

{ name: ["Jimmy","Jill"], age: [23, 42], location: { city: ["LA", "NYC"] }

对于每个对象键,都有一个包含2个条目的数组值(总是)。我想要做的是通过拔出数组中的第二项来重新创建对象。但我希望这是递归发生的。所以输出将是:

{ name: "Jill", age: 42, location: { city: "NYC" }

我尝试使用Object.keys()迭代对象,但这似乎不会给我嵌套键。我想知道是否有更优雅的方法来解决这个问题?

非常感谢提前。

3 个答案:

答案 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' }