Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在JS数组中设置objects参数时出现问题_Javascript_Arrays_Object_Geojson - Fatal编程技术网

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();