我从以下代码
中的文档中获取mongodb返回的值collection.find({"Stories._id":ObjectID(storyId)}, {"Stories.$":1}, function (e, docs) {
var results = docs;
results[0].Stories = [];
}
我将docs的值分配给结果。然后我将结果中的一个数组更改为空数组。我面临的问题是,如果我改变结果的价值,文档的价值也会受到影响!!
我怎样才能单独更改results[0]
的值?
一个简单的JSFIDDLE链接
答案 0 :(得分:0)
这是因为在java-script数组中,对象本质上是可变的。 如果y是对象,则以下语句不会创建y的副本:
var x = y; // This will not create a copy of y.
对象x不是y的副本。是的。 x和y都指向同一个对象。
对y的任何更改也会更改x,因为x和y是同一个对象。
您可以使用以下解决方案:
在 Jquery
中 results = $.extend(true,{},docs);//For deep copy
results = $.extend({},docs);//For shallow copy
results = JSON.parse(JSON.stringify(docs))
在 Javascript
中function clone(obj) {
var target = {};
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
target[i] = obj[i];
}
}
return target;
}
results = clone(docs);
答案 1 :(得分:0)
您可以更改'结果[0]'的值单独而不影响' docs'通过使用范围概念。尝试在函数中进行更改,而不是在直接行或同一层次结构中进行更改。 我写了一个样本here at Fiddle 几个月前,我正在试验如何通过引用传递的概念在JS中的对象方面起作用。我们必须注意到ds.find()的返回类型是一个json。 You can read my article here 感谢。
var docs = [1,2,3];
var results = docs;
console.log(results[0]);
var documents =[ {
'stories':'eshwar',
'place':'Hyd'
},
{
'stories':'Prasad',
'place':'Del'
},
{
'stories':'Hari',
'place':'Chennai'
}]
console.log(documents[2]); //prints {stories: "Hari", place: "Chennai"}
function ChangeAlone(documents){
var refDoc = documents;
refDoc[2] =[];
}
// the value of stories remains same in the parent object without change
console.log(documents[2].stories); //prints Hari