JavaScript:将对象映射到不同的结构

JavaScript:将对象映射到不同的结构,javascript,Javascript,我的应用程序从各种源系统接收数据。这些数据性质相同,但结构不同。我需要统一结构并将它们保存到一个公共存储库中 我现在正在做的事情如下: function setSubFieldValue(obj, field, value) { if(field && obj && value) { var i = field.indexOf('\.'); if( i > 0) { var p = field.

我的应用程序从各种源系统接收数据。这些数据性质相同,但结构不同。我需要统一结构并将它们保存到一个公共存储库中

我现在正在做的事情如下:

function setSubFieldValue(obj, field, value) {
    if(field && obj && value) {
        var i = field.indexOf('\.');
        if( i > 0) {
            var p = field.slice(0, i);
            if(!obj[p]) obj[p] = {}; 
            setSubFieldValue(obj[p], field.slice(i+1), value)
        } else obj[field] = value;
    }
}

function getSubFieldValue(obj, field) {
    if(field) {
        var i = field.indexOf('\.');
        if (i > 0) {
            var p = field.slice(0, i); 
            if(obj[p]) {
                var v = field.slice(i+1);
                return getSubFieldValue(obj[p], v);
            }
        } else return obj[field];
    }
}

function mapObject (srcObj, fieldMap) {
    var obj = {};

    Object.keys(fieldMap).forEach(function(k) {
        var v = getSubFieldValue(srcObj, k);
        if(v) setSubFieldValue(obj, fieldMap[k], v);
    });

    return obj;
};
定义传入对象和输出对象之间的结构映射。例如,对于源对象,例如:

{id:'123', message:'hi', from:{id:'user1', name:'John'}}, 
其映射对象如下:

var map = {_id:'id', message:'text', 'from.id':'by.id', 'from.name':'by.name'};
定义功能如下:

function setSubFieldValue(obj, field, value) {
    if(field && obj && value) {
        var i = field.indexOf('\.');
        if( i > 0) {
            var p = field.slice(0, i);
            if(!obj[p]) obj[p] = {}; 
            setSubFieldValue(obj[p], field.slice(i+1), value)
        } else obj[field] = value;
    }
}

function getSubFieldValue(obj, field) {
    if(field) {
        var i = field.indexOf('\.');
        if (i > 0) {
            var p = field.slice(0, i); 
            if(obj[p]) {
                var v = field.slice(i+1);
                return getSubFieldValue(obj[p], v);
            }
        } else return obj[field];
    }
}

function mapObject (srcObj, fieldMap) {
    var obj = {};

    Object.keys(fieldMap).forEach(function(k) {
        var v = getSubFieldValue(srcObj, k);
        if(v) setSubFieldValue(obj, fieldMap[k], v);
    });

    return obj;
};
代码在大多数情况下都会起作用,但也有一些缺点:

  • 不支持数组中对象的结构映射。比如说,

    {arrayproperty:[{a:1, b:2}, {a:2, b:3}]}
    
    上面的代码不允许我将此arrayproperty映射到目标对象中的其他结构,例如:

    {newfield:[{field_a:1, field_b:2}, {field_a:2, field_b:3}]}
    

  • 使用递归调用,性能不佳


  • 我想知道是否有人有类似的需求,并且对现有的库有一些想法,以便优雅地执行这样的任务

    你能解释一下不支持数组中对象的结构映射吗。可能是样品?格伦迪,谢谢你的评论。现在,我已经在文章中添加了关于点本身的更多详细信息。你能为你的数组示例提供
    map
    对象吗?这正是我想要解决的问题。我可以想出一些处理数组的概念,但代码会变得相当麻烦。我正在寻找一些现有的、经过良好测试的解决方案。所以,正如我看到的,您使用此函数仅更改字段名,而不更改结构?我是对的?