尽力解释我正在做的事情.

我有两个模型,我和我收到的api回复.当项目api响应进来时,我需要将其映射到我的模型并插入所有项目.这当然很简单.回答这个问题,我需要这样做,而不知道我正在处理什么.我的代码将被传递两个字符串,我的一个模型映射路径和一个api响应映射路径.

这是两条路

var myPath = "outputModel.items[].uniqueName"
var apiPath = "items[].name"

基本上为apiPath中的所有项目,推入myPath中的项目并设置为uniqueName

归结到的是,当需要映射两个项目时,或者即使它们包含一个数组或简单的字段到现场路径,我的代码也没有任何意义.他们甚至可以包含多个数组,如下所示:

********************示例*************************

var items = [
    {
        name: "Hammer",skus:[
            {num:"12345qwert"}
        ]
    },{
        name: "Bike",skus:[
            {num:"asdfghhj"},{num:"zxcvbn"}
        ]
    },{
        name: "Fork",skus:[
            {num:"0987dfgh"}
        ]
    }
]

var outputModel = {
    storeName: "",items: [
        {
            name: "",sku:""
        }
    ]
};


outputModel.items[].name = items[].name;
outputModel.items[].sku = items[].skus[].num;

************************以上是上述的预期结果

var result = {
    storeName: "",items: [
        {
            name: "Hammer",sku:"12345qwert"
        },{
            name: "Bike",sku:"asdfghhj"
        },sku:"zxcvbn"
        },{
            name: "Fork",sku:"0987dfgh"        }
    ]
};

我将给出一组要映射的每个值的路径.在上面的情况下,我被交给了两组路径,因为我映射了两个值.它必须遍历两组数组以在我的模型中创建单个数组.

问题 – 无论两个模型路径如何,我如何动态地检测数组并正确移动数据?可能?

解决方法

如在评论中提到的,输入格式没有严格的定义,很难用完美的错误处理来处理所有的角落.

这是我的冗长实现,适用于您的示例,但对于其他一些情况可能会失败:

function merge_objects(a,b) {
    var c = {},attr;
    for (attr in a) { c[attr] = a[attr]; }
    for (attr in b) { c[attr] = b[attr]; }
    return c;
}


var id = {
    inner: null,name: "id",repr: "id",type: "map",exec: function (input) { return input; }
};

// set output field
function f(outp,mapper) {
    mapper = typeof mapper !== "undefined" ? mapper : id;
    var repr = "f("+outp+","+mapper.repr+")";
    var name = "f("+outp;
    return {
        inner: mapper,name: name,repr: repr,clone: function(mapper) { return f(outp,mapper); },exec:
        function (input) {
            var out = {};
            out[outp] = mapper.exec(input);
            return out;
        }
    };
}

// set input field
function p(inp,mapper) {
    var repr = "p("+inp+","+mapper.repr+")";
    var name = "p("+inp;
    return {
        inner: mapper,type: mapper.type,clone: function(mapper) { return p(inp,exec: function (input) {
            return mapper.exec(input[inp]);
        }
    };
}

// process array
function arr(mapper) {
    var repr = "arr("+mapper.repr+")";
    return {
        inner: mapper,name: "arr",clone: function(mapper) { return arr(mapper); },exec: function (input) {
            var out = [];
            for (var i=0; i<input.length; i++) {
                out.push(mapper.exec(input[i]));
            }
            return out;
        }
    };
}

function combine(m1,m2) {
    var type = (m1.type == "flatmap" || m2.type == "flatmap") ? "flatmap" : "map";
    var repr = "combine("+m1.repr+","+m2.repr+")";
    return {
        inner: null,type: type,name: "combine",exec:
        function (input) {
            var out1 = m1.exec(input);
            var out2 = m2.exec(input);
            var out,i,j;


            if (m1.type == "flatmap" && m2.type == "flatmap") {
                out = [];
                for (i=0; i<out1.length; i++) {
                    for (j=0; j<out2.length; j++) {
                        out.push(merge_objects(out1[i],out2[j]));
                    }
                }
                return out;
            }

            if (m1.type == "flatmap" && m2.type != "flatmap") {
                out = [];
                for (i=0; i<out1.length; i++) {
                    out.push(merge_objects(out1[i],out2));
                }
                return out;
            }

            if (m1.type != "flatmap" && m2.type == "flatmap") {
                out = [];
                for (i=0; i<out2.length; i++) {
                    out.push(merge_objects(out2[i],out1));
                }
                return out;
            }

            return merge_objects(out1,out2);
        }
    };
}

function flatmap(mapper) {
    var repr = "flatmap("+mapper.repr+")";
    return {
        inner: mapper,type: "flatmap",name: "flatmap",clone: function(mapper) { return flatmap(mapper); },exec:
        function (input) {
            var out = [];
            for (var i=0; i<input.length; i++) {
                out.push(mapper.exec(input[i]));
            }
            return out;
        }
    };
}



function split(s,t) {
    var i = s.indexOf(t);

    if (i == -1) return null;
    else {
        return [s.slice(0,i),s.slice(i+2,s.length)];
    }
}

function compile_one(inr,outr) {
    inr = (inr.charat(0) == ".") ? inr.slice(1,inr.length) : inr;
    outr = (outr.charat(0) == ".") ? outr.slice(1,outr.length) : outr;

    var Box = split(inr,"[]");
    var Box2 = split(outr,"[]");
    var m,ps,fs,j;

    if (Box == null && Box2 == null) { // no array!
        m = id;

        ps = inr.split(".");
        fs = outr.split(".");

        for (i=0; i<fs.length; i++) { m = f(fs[i],m); }
        for (j=0; j<ps.length; j++) { m = p(ps[j],m); }

        return m;
    }

    if (Box != null && Box2 != null) { // array on both sides
        m = arr(compile_one(Box[1],Box2[1]));

        ps = Box[0].split(".");
        fs = Box[0].split(".");

        for (i=0; i<fs.length; i++) { m = f(fs[i],m); }

        return m;
    }

    if (Box != null && Box2 == null) { // flatmap
        m = flatmap(compile_one(Box[1],outr));

        ps = Box[0].split(".");

        for (j=0; j<ps.length; j++) { m = p(ps[j],m); }

        return m;
    }

    return null;
}

function merge_rules(m1,m2) {
    if (m1 == null) return m2;
    if (m2 == null) return m1;

    if (m1.name == m2.name && m1.inner != null) {
        return m1.clone(merge_rules(m1.inner,m2.inner));
    } else {
        return combine(m1,m2);
    }

}

var input = {
    store: "myStore",items: [
        {name: "Hammer",skus:[{num:"12345qwert"}]},{name: "Bike",skus:[{num:"asdfghhj"},{num:"zxcvbn"}]},{name: "Fork",skus:[{num:"0987dfgh"}]}
    ]
};

var m1 = compile_one("items[].name","items[].name");
var m2 = compile_one("items[].skus[].num","items[].sku");
var m3 = compile_one("store","storeName");
var m4 = merge_rules(m3,merge_rules(m1,m2));
var out = m4.exec(input);


alert(JSON.stringify(out));

Javascript:确定未知数组长度并动态映射的更多相关文章

  1. HTML5 input新增type属性color颜色拾取器的实例代码

    type 属性规定 input 元素的类型。本文较详细的给大家介绍了HTML5 input新增type属性color颜色拾取器的实例代码,感兴趣的朋友跟随脚本之家小编一起看看吧

  2. 移动HTML5前端框架—MUI的使用

    这篇文章主要介绍了移动HTML5前端框架—MUI的使用的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. 使用placeholder属性设置input文本框的提示信息

    这篇文章主要介绍了使用placeholder属性设置input文本框的提示信息,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  4. Bootstrap File Input文件上传组件

    这篇文章主要介绍了Bootstrap File Input文件上传组件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  6. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. HTML5中input输入框默认提示文字向左向右移动的示例代码

    这篇文章主要介绍了HTML5中input输入框默认提示文字向左向右移动,本文通过实例代码给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. ios – parse.com用于键,预期字符串的无效类型,但是得到了数组

    我尝试将我的数据保存到parse.com.我已经预先在parse.com上创建了一个名为’SomeClass’的类.它有一个名为’mySpecialColumn’的列,其数据类型为String.这是我尝试使用以下代码保存数据的代码:如果我运行这个我得到:错误:密钥mySpecialColumn的无效类型,预期字符串,但得到数组这就是我在parse.com上的核心外观:有谁知道我为什么会收到这个错误?

  10. ios – 上下文类型’NSFastEnumeration’不能与数组文字一起使用

    斯威夫特3,你会这样做吗?解决方法正如您所发现的,您不能使用as-casting将数组文字的类型指定为NSFastEnumeration.您需要找到一个符合NSFastEnumeration的正确类,在您的情况下它是NSArray.通常写这样的东西:

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部