使用另一个对象的属性在javascript中构建一个对象
building an object in javascript using properties from another object
我要做的是创建一个对象,其中有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;
}
不能在对象文字中间声明变量或使用其他语句,如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;
}
演示:http://jsfiddle.net/nnnnnn/TQf5H/
除了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
where
a
是第一个对象b
是第二个对象prop
是当前被合并的属性。
如果存在类型冲突。例如,值1是primitive
,值2是Object
prop
is null
示例调用
用上下文调用merge函数,而不是它所在的作用域,它将对象合并到其中。
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]
})
下面是一个关于JSBin的例子
输出例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]
}
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- javascript处理一个对象数组以获得一个新的对象数组
- javascript函数,它接受两个输入:一个对象和一个键,并返回对象中该键的相应值
- 将javascript对象(属性+值)合并到一个对象中
- 从 javascript 中的对象方法返回一个对象
- 用javascript创建另一个对象的实例
- 从javascript函数返回一个对象
- 为什么在Javascript中将一个对象分配给另一个变量也会更改初始对象
- 是否可以创建一个对象,该对象是另一个对象的子集,而不会丢失javascript中的引用
- 当一个对象与javascript画布中的另一个对象发生冲突时,如何停止该对象
- JavaScript:如何将“.bind()”“函数”到另一个对象
- Javascript,重复一个对象键N次,是N个它的值
- JavaScript:为什么 array.push() 附加两个对象而不是一个对象
- 通过另一个对象上的字符串值为 javascript 对象属性赋值
- 引用另一个对象javascript中的对象
- 如何删除上一页 .上一个对象?Javascript .prev().remove();.
- 访问数组中的对象,该对象是另一个对象Javascript的属性
- 使对象中的对象成为一个对象javascript
- 附加到一个对象- javascript
- 将一个对象分配给另一个对象 Javascript