Javascript 在JS数组中设置objects参数时出现问题
Javascript 在JS数组中设置objects参数时出现问题,javascript,arrays,object,geojson,Javascript,Arrays,Object,Geojson,我喜欢在JS数组中生成包含带有随机坐标值的GeoJson对象。 我一开始用循环将10个对象推到数组中,这部分工作正常,但当我喜欢设置坐标的随机值(因此每个对象都有不同的坐标)时,我会为每个对象接收相同的坐标 这是一种参考传递问题吗?如何处理 我的代码如下所示: //random number generator function randomNumber(){ min = Math.floor(0); max = Math.floor(360); let coordina
我喜欢在JS数组中生成包含带有随机坐标值的GeoJson对象。 我一开始用循环将10个对象推到数组中,这部分工作正常,但当我喜欢设置坐标的随机值(因此每个对象都有不同的坐标)时,我会为每个对象接收相同的坐标 这是一种参考传递问题吗?如何处理
我的代码如下所示:
//random number generator
function randomNumber(){
min = Math.floor(0);
max = Math.floor(360);
let coordinateX = Math.floor(Math.random()*(max-min+1))+min;
let coordinateY = Math.floor(Math.random()*(max-min+1))+min;
return [coordinateX,coordinateY]
};
//geoJson object structure example
let featureClassObject = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [10,10] //these don't like to cooperate
},
"properties": {
"name": "Dinagat Islands"
}
}
//generating array and and pushing 10x GeoJson Object
let featuresArray = [];
for (let i=0;i<10;i++){
featuresArray.push(featureClassObject);
}
//changing the value of coordinates
featuresArray.forEach((item)=>{
item.geometry.coordinates=randomNumber();
});
//随机数生成器
函数randomNumber(){
最小值=数学层(0);
最大值=数学楼层(360);
让coordinateX=Math.floor(Math.random()*(max-min+1))+min;
让coordinateY=Math.floor(Math.random()*(max-min+1))+min;
返回[协调人,协调人]
};
//geoJson对象结构示例
让featureClassObject={
“类型”:“功能”,
“几何学”:{
“类型”:“点”,
“坐标”:[10,10]//他们不喜欢合作
},
“财产”:{
“名称”:“迪纳加特群岛”
}
}
//生成数组并推送10x GeoJson对象
设featuresArray=[];
for(设i=0;i{
item.geometry.coordinates=randomNumber();
});
您正在推同一个对象10次。通过使用,您可以轻松修复此问题
const featuresArray=[];
for(设i=0;i<10;i++){
featuresArray.push(Object.assign({},featureClassObject));
}
这将推送10个包含相同数据的不同对象。使用Object.assign()复制嵌套对象,这样您就不仅仅是引用指针了:
function randomNumber(){
min = Math.floor(0);
max = Math.floor(360);
let coordinateX = Math.floor(Math.random()*(max-min+1))+min;
let coordinateY = Math.floor(Math.random()*(max-min+1))+min;
return [coordinateX,coordinateY]
};
//geoJson object structure example
let featureClassObject = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [10,10]
},
"properties": {
"name": "Dinagat Islands"
}
}
//generating array and and pushing 10x GeoJson Object
let featuresArray = [];
for (let i=0;i<10;i++){
featureClassCopy = Object.assign({}, featureClassObject);
featureClassCopy.geometry = Object.assign({}, featureClassCopy.geometry);
featuresArray.push(featureClassCopy);
}
//changing the value of coordinates
featuresArray.forEach((item)=>{
item.geometry.coordinates=randomNumber();
});
函数randomNumber(){
最小值=数学层(0);
最大值=数学楼层(360);
让coordinateX=Math.floor(Math.random()*(max-min+1))+min;
让coordinateY=Math.floor(Math.random()*(max-min+1))+min;
返回[协调人,协调人]
};
//geoJson对象结构示例
让featureClassObject={
“类型”:“功能”,
“几何学”:{
“类型”:“点”,
“坐标”:[10,10]
},
“财产”:{
“名称”:“迪纳加特群岛”
}
}
//生成数组并推送10x GeoJson对象
设featuresArray=[];
for(设i=0;i{
item.geometry.coordinates=randomNumber();
});
因此,一般来说,上述内容是一种参考传递问题。如何检查它?
array[0]===array[1]
当上述返回true时,表示您已经在数组中创建了对一个对象的多个引用 要处理它,有一种方法->在将对象推送到数组之前必须复制对象。
复制对象有两种方法:
1。浅复制(不复制对象的嵌套部分,对于对象的嵌套部分仍然返回引用):
-
让copyofoobjectfirstway=Object.assign({},objectName)代码>
-让copyOfObjectSecondWay={…objectName}
2。深度复制(复制整个零件,甚至是嵌套零件):
-让copyOfObjectDeepWay=JSON.parse(JSON.stringify(objectName))代码>-当对象较大且复杂时,这可能会导致一些性能问题
在我的例子中(根据Seanonymous的提示),我通过生成返回对象副本(已解析并字符串化)的对象生成器函数来解决这个问题
我的代码
function randomNumber(min, max){
let random = ((Math.random()*(max-min+1))+min).toFixed(4);
return random
};
function objectGenerator(){
let featureClassObject = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [10,10]
},
"properties": {
"name": "Dinagat Islands"
}
};
featureClassObject.geometry.coordinates=[randomNumber(20.13666, 21.875),
randomNumber(51.87,52.3160)];
let newFeatureClassObcject= JSON.parse(JSON.stringify(featureClassObject));
return newFeatureClassObcject;
};
let randomFeatureClassArray= [];
function randomGeometryObjectArrayGenerator(){
let t0=performance.now();
for (let i=0;i<100;i++){
randomFeatureClassArray.push(objectGenerator());
};
let t1=performance.now();
console.log(`the array was generated in ${t1-t0} miliseconds`)
};
randomGeometryObjectArrayGenerator();
函数随机数(最小值、最大值){
设random=((Math.random()*(max-min+1))+min.toFixed(4);
返回随机数
};
函数对象生成器(){
让featureClassObject={
“类型”:“功能”,
“几何学”:{
“类型”:“点”,
“坐标”:[10,10]
},
“财产”:{
“名称”:“迪纳加特群岛”
}
};
featureClassObject.geometry.coordinates=[randomNumber(20.13666,21.875),
随机数(51.87,52.3160)];
让newFeatureClassObject=JSON.parse(JSON.stringify(featureClassObject));
返回NewFeatureClassObject;
};
让randomFeatureClassArray=[];
函数randomGeometryObjectArrayGenerator(){
设t0=performance.now();
for(设i=0;i
function randomNumber(min, max){
let random = ((Math.random()*(max-min+1))+min).toFixed(4);
return random
};
function objectGenerator(){
let featureClassObject = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [10,10]
},
"properties": {
"name": "Dinagat Islands"
}
};
featureClassObject.geometry.coordinates=[randomNumber(20.13666, 21.875),
randomNumber(51.87,52.3160)];
let newFeatureClassObcject= JSON.parse(JSON.stringify(featureClassObject));
return newFeatureClassObcject;
};
let randomFeatureClassArray= [];
function randomGeometryObjectArrayGenerator(){
let t0=performance.now();
for (let i=0;i<100;i++){
randomFeatureClassArray.push(objectGenerator());
};
let t1=performance.now();
console.log(`the array was generated in ${t1-t0} miliseconds`)
};
randomGeometryObjectArrayGenerator();