将值和属性从一个对象合并到另一个对象

Merge values and properties from one object into another

本文关键字:一个对象 合并 属性      更新时间:2024-03-15

我有两个独立的对象:

对象1

var obj1 = {
    features: {
        "1234": {
            "price": 0
        },
        "1235": {
            "price": 0
        }
    }
};

对象2

var obj2 = {
    features: {
        "1234": {
            "price": 1000,
            "property": "val"
        },
        "1235": {
            "price": 500,
            "property": "val"
        }
    }
};

我想将对象1的价格属性设置为目标2价格属性的值,其中键(1234、1235等)在两个对象中匹配。

此外,我想知道如何将新属性从对象2添加到Object 1

最后,我希望对象3看起来像:

var obj3 = {
    features: {
        "1234": {
            "price": 1000,
            "property": "val"
        },
        "1235": {
            "price": 500,
            "property": "val"
        }
    }
};

我试过以下方法,但肯定有更好的方法吗?

var obj3 = {};
for (key in obj1) {
    if (obj1.hasOwnProperty(key)) {
        var val = obj1[key];
        if (typeof val === 'object') {
            for (obj1_key in val) {
                if (val.hasOwnProperty(obj1_key)) {
                    if (obj1_key === 'price') {
                        // set value to value of obj2 price property
                    }
                    // add a new property to object #3
                    obj3[obj1_key]['property'] = 'value_of_object_2_property';
                }
            }
        }
        // add to new object #3
        obj3[key] = val;
    }
}

我知道有一些库可以帮助解决这类问题,比如下划线,所以如果你有关于如何使用下划线或lodash实现这一点的建议,我愿意接受任何建议。

你可以用lodash来完成。在这两种解决方案中,您都可以使用_.pluck函数从obj2中提取任何字段。

解决方案1,通过obj1字段循环:

var obj3 = { features: {} };
_(obj1.features)
    .keys()
    .each(function(id) {
       var price = ob2.prices[id];
       if (price) {
         obj3.features[id] = _.pick(price, ['price', 'property']);
       }
    })
    .value();

解决方案2,使用reduce功能:

var obj3 = _.reduce(ob1.feature, function(result, value, id) {
  var price = ob2.prices[id];
  if (price) {
    result.features[id] = _.pick(price, ['price', 'property']);
  }
  return result;
}, { features: {}});

使用_.merge

这个方法类似于_.assign,只是它递归地将源对象的自己和继承的可枚举字符串键控属性合并到目标对象中。如果存在目标值,将跳过解析为未定义的源属性。数组和普通对象属性以递归方式合并。其他对象和值类型将被赋值覆盖。源对象是从左到右应用的。后续源将覆盖以前源的属性分配。

var obj1 = {
    features: {
        "1234": {
            "price": 0
        },
        "1235": {
            "price": 0
        }
    }
};
var obj2 = {
    features: {
        "1234": {
            "price": 1000,
            "property": "val"
        },
        "1235": {
            "price": 500,
            "property": "val"
        }
    }
};
var obj3 = {};
_.merge(obj3,obj1,obj2);
document.getElementById('result').innerHTML = JSON.stringify(obj3,null,2);
console.log(obj3);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.10.0/lodash.min.js"></script>
<pre id='result'></pre>