【问题标题】:Realiable mergin two JavaScript objects and altering their key names可靠地合并两个 JavaScript 对象并更改它们的键名
【发布时间】:2011-07-30 23:33:55
【问题描述】:

这与其说是一个问题,不如说是对 cme​​ts 的请求。

我有两个对象,我想将它们合并在一起,取第二个的值,并与第一个的值合并(覆盖),同时保留第一个的属性名称。

第二个对象中的键名很长且易于描述,而第一个对象的键名简洁而难看,以节省字节。

在第二个对象的可读性成为问题之前,我使用的是 jQuery,所以现在我将自己的方式组合在一起。但是,由于迭代对象不会以原始顺序返回它们的键/值对,我想知道这是否是一个长期可行的解决方案。希望代码能更好地解释这一点。

请提出想法,并在此先感谢! :)

var ob = {}, i = 0, k, pArr = [];

for( k in p ){

    if( p.hasOwnProperty(k) ){
        pArr.push(k);
    }

}

for( k in c ){

    if( c.hasOwnProperty(k) ){
        ob[pArr[i]] = c[k];
    }

    i++;

}

ob 对象现在具有第二个对象的所有属性,但具有第一个对象的键名。这确实有效,但感觉很难看,我想知道是否有更好的方法。

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    您已经发现循环不会以任何特定顺序返回对象。因此,ob[pArr[i]] = cArr[k]; 行不安全。

    1. 您将需要键名的映射(比如说 p_key => c_key)。

    2. 迭代映射。

    例子:

    for (p_key in map)
        c_key = map[p_key];
        ob[p_key] = c[c_key];
    

    Example2 - 保留真正的 p 属性:

    for (p_key in p) ob[p_key] = p[p_key];
    for (... same as above)
    

    【讨论】:

    • 这允许我用第二个对象覆盖一个对象,每个值的值,但也不允许我保留第一个对象的属性名称。但我正在调整它。
    • 那么,只需将ob[p_key] = c[c_key] 更改为p[p_key] = c[c_key],您的第一个对象就会更新为第二个对象的所有值。但是,如果您想要所有未映射的 p-key,则需要预先使用 p 的所有值初始化 ob
    • 使用我的方法,重复该过程 100000 次,所有属性在退出时都与进入时相同......这只是机会吗?
    • 在你的第二个例子中,它保留了第一个对象的键名,还有属性值......
    • 您运行 example2,然后运行 ​​example1(...同上)。关于订单:stackoverflow.com/questions/280713/…
    猜你喜欢
    • 2021-01-02
    • 2023-04-04
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多