首页 > 解决方案 > 使用Javascript递归替换未知大小的对象中的键

问题描述

我希望能够keys使用 Javascript 在动态大小的对象中替换某些内容。例如,我有一个可能如下所示的对象:

var obj = {
    where: {
        hypes: {
            lte: 12 <-- replace key
        },
        or: [
            {
                hypes: {
                    lt: 14 <-- replace key
                }
            },
            {
                id: {
                    lt: 10 <-- replace key
                }
            }
        ]
    } 
}

为了使该对象与我一起使用,Sequelize我需要将以下键转换为Sequelize运算符:ltorlte. 我创建了一个operators充当字典的对象,因此我可以从中提取Sequelize运算符:

const operators = {
    'eq': [Op.eq],
    'lte': [Op.lte],
    'lt': [Op.lt],
    'or': [Op.or]
};

我在想我可以使用operators对象来匹配的键obj并将其替换为operators对象的值。我想我可以使用以下递归函数来遍历obj给定的未知大小:

const iterate = (obj) => {
    Object.keys(obj).forEach(key => {

    console.log(`key: ${key}, value: ${obj[key]}`)

    if (typeof obj[key] === 'object') {
            iterate(obj[key])
        }
    })
}

上面的函数将检查一个键的值是否是一个对象,并iterate()再次调用该方法。

因此我可以调用:iterate(obj)它会递归地映射对象中的所有嵌套属性。

我遇到的问题是,当键与对象内的属性匹配时,如何替换键,operators以便最终得到obj如下所示的键:

var obj = {
    where: {
        hypes: {
            lte: 12
        },
        [Op.or]: [ <-- changed
            {
                hypes: {
                    [Op.lt]: 14 <-- changed
                }
            },
            {
                id: {
                    [Op.lt]: 10 <-- changed
                }
            }
        ]
    } 
}

谢谢!

标签: javascriptrecursion

解决方案


您可以采用递归方法。

function replace(object) {
    return Array.isArray(object)
        ? object.map(replace)
        : object && typeof object === 'object'
            ? Object.fromEntries(Object
                .entries(object)
                .map(([k, v]) => [k in operators ? operators[k] : k, replace(v)])
            )
            : object;
}

var obj = { where: { hypes: { lte: 12 }, or: [{ hypes: { lt: 'xx' } }, { id: { lt: 10 } }] } };

const operators = { eq: '[Op.eq]', lte: '[Op.lte]', lt: '[Op.lt]', or: '[Op.or]' };

console.log(replace(obj));


推荐阅读