我要做的是创建一个对象,其中包含x个属性,以及从调用另一个方法检索的另一个对象的y个属性。这可能吗?
即这是我的伪代码。基本上我希望mydata包含我从getMoreData()返回的对象的所有属性 也许这是不可能的,但我不知道怎么做,如果是:(
var mydata =
{
name: "Joe Soap",
dob: "01-01-2001",
otherData: {
hasCat: true,
hasDog : false
}
var otherData = getMoreData();
for(var prop in otherData)
{
create additional property in mydata for prop;
}
}
function getMoreData()
{
var moreData =
{
middleName: "tom",
location: "uk"
}
return otherData;
}
答案 0 :(得分:0)
您不能在对象文字的中间声明变量或使用其他语句,如for
。您需要先定义基本对象,然后再添加属性:
var mydata = {
name: "Joe Soap",
dob: "01-01-2001",
otherData: {
hasCat: true,
hasDog : false
}
};
var otherData = getMoreData();
for(var prop in otherData) {
mydata[prop] = otherData[prop];
}
此外,您的getMoreData()
函数需要返回moreData
变量,而不是otherData
:
function getMoreData() {
var moreData = {
middleName: "tom",
location: "uk"
}
return moreData;
}
答案 1 :(得分:0)
除nnnnnn
的答案外。
请注意,上面只有浅色副本。
如果您有Object
,则表示它会被引用复制。
这是一个更高级的合并功能。我稍后会详细解释一下。
var merge = (function () {
var initThis = this;
return function () {
var len = arguments.length - 1,
srt, tmp;
if ("function" === typeof arguments[arguments.length - 1]) srt = arguments[arguments.length - 1];
else {
srt = function (a, b, prop) {
if (null === prop) return a;
return a[prop];
};
len++;
}
var merge = this === initThis ? {} : this;
for (var i = 0; i < len; i++) inner(arguments[i], merge);
function inner(obj2, obj1) {
var type = ({}).toString.call(obj2);
if (type == "[object Object]") {
if (!obj1) obj1 = {};
if (typeof obj1 != "object") obj1 = (tmp = srt(obj1, obj2, null), tmp) === obj2 ? {} : tmp; //If obj2 is returned, set to empty obj to allow deep cloning
for (var prop in obj2) {
var isObj = "object" === typeof obj2[prop];
if (!obj1[prop] && isObj) obj1[prop] = inner(obj2[prop]);
else if (obj1[prop] && isObj) obj1[prop] = inner(obj2[prop], obj1[prop]);
else if (obj1[prop]) obj1[prop] = srt(obj1, obj2, prop) || obj1[prop];
else obj1[prop] = obj2[prop];
}
} else if (type == "[object Array]") {
if (!obj1) obj1 = [];
if (typeof obj1 != "object") obj1 = (tmp = srt(obj1, obj2, null), tmp) === obj2 ? [] : tmp
for (var i = 0; i < obj2.length; i++) if (!obj1[i] && typeof obj2[i] == "object") obj1[i] = inner(obj2[i]);
else if (obj1[i] && typeof obj2[i] == "object") obj1[i] = inner(obj2[i], obj1[i]);
else if (obj1[i]) obj1[i] = (function (i) {
return srt(obj1, obj2, i)
})(i) || obj1[i];
else obj1[i] = obj2[i];
}
return obj1;
}
return merge;
};
})();
var target = {
unique: "a",
conflict: "target",
object: {
origin: "target"
},
typeConflict: "primitive",
arr: [1, 5, 3, 6]
};
var mergeFrom = {
other: "unique",
conflict: "mergeFrom",
object: {
origin: "mergeFrom",
another: "property"
},
typeConflict: ["object"],
arr: [3, 2, 7, 1]
};
合并功能接受n
个参数。
将所有传递的对象合并为一个并返回它。
您可以设置包含对象的.call
的上下文。
conflict
函数可以作为最后一个参数传递。
如果一个属性已经存在,那就会被调用。
用3个参数调用它。
a
,b
,prop
其中
a
是第一个对象
b
是第二个对象
prop
是当前合并的属性。
如果是类型冲突。例如,值1是primitive
,值2是Object
prop
是null
使用上下文调用合并函数,而不是它的作用域。它将Object合并到其中。
merge.call(target,mergeFrom)
调用它,传递始终使用对象b
属性的冲突函数。
var result = merge(target,mergeFrom,function (a,b,prop) {
if (prop === null) return b
return b[prop]
})
调用它传递3个数组和冲突函数,将值推送到第一个
var mergedArr = merge({arr:[1]},{arr:[2]},{arr:[3]},function (a,b,prop) {
if (a[prop] != b[prop]) a.push(b[prop])
return a[prop]
})
为例
示例1 - console.log(target)
{
"arr": [1, 5, 3, 6],
"as": "arguments",
"conflict": "target",
"more": "Objects",
"object": {
"another": "property",
"origin": "target"
},
"other": "unique",
"typeConflict": "primitive",
"unique": "a"
}
示例2 - console.log(result)
{
"arr": [3, 2, 7, 1],
"conflict": "mergeFrom",
"object": {
"another": "property",
"origin": "mergeFrom"
},
"other": "unique",
"typeConflict": ["object"],
"unique": "a"
}
示例3 - console.log(mergedArr)
{
"arr": [1, 2, 3]
}