Javascript 如何在JS中将一个大的1D数组转换成一系列小的key:pair对象?

Javascript 如何在JS中将一个大的1D数组转换成一系列小的key:pair对象?,javascript,three.js,Javascript,Three.js,我正在尝试用3JS制作手绘画板。大部分部分已经完成,并且能够绘制形状。现在,我的下一步是使用简化多边形中的点。 问题是我将数组作为缓冲区几何体传递,并使用线网格在屏幕上绘制。我正在创建类似[x,y,z,x,y,z,x,y,z…等等]的数组,直到最大点,在我的例子中是10000。范例 Vertices[0.555,0.323,298,0.585,0.353,298,0.615,0.373,298...continuous]. 现在如何将这些顶点转换为 Vertices[{x:0.555,y:0.

我正在尝试用3JS制作手绘画板。大部分部分已经完成,并且能够绘制形状。现在,我的下一步是使用简化多边形中的点。 问题是我将数组作为缓冲区几何体传递,并使用线网格在屏幕上绘制。我正在创建类似[x,y,z,x,y,z,x,y,z…等等]的数组,直到最大点,在我的例子中是10000。范例

Vertices[0.555,0.323,298,0.585,0.353,298,0.615,0.373,298...continuous].
现在如何将这些顶点转换为

Vertices[{x:0.555,y:0.323,z:298}, {x:0.585,y:0.353,z:298},{x:0.615,y:0.373,z:298}]
…等等,直到顶点。长度


提前感谢。

您可以使用简单的for循环遍历阵列并将对象推送到新阵列中

var vertices = [0.555,0.323,298,0.585,0.353,298,0.615,0.373,298];
var convertedVertices = [];

for(let i = 0; i < vertices.length; i += 3){
  convertedVertices.push({ x: vertices[i], y: vertices[i+1], z: vertices[i+2] })
}

console.log(convertedVertices);
JSBin:


JSBin:

您可以使用一个简单的for循环遍历数组并将对象推送到新数组中

var vertices = [0.555,0.323,298,0.585,0.353,298,0.615,0.373,298];
var convertedVertices = [];

for(let i = 0; i < vertices.length; i += 3){
  convertedVertices.push({ x: vertices[i], y: vertices[i+1], z: vertices[i+2] })
}

console.log(convertedVertices);
JSBin:


JSBin:

如果您有这方面的测试数据,那就太好了,但我认为类似于以下内容的东西应该可以正常工作

const keysMap = ['x', 'y', 'z']
let transformedArr = [];
let vertices = [0.555,0.323,298,0.585,0.353,298,0.615,0.373,298...continuous]
while (vertices.length) {
  vector = {};
  vertices.slice(o, 2).forEach( (val, ind) => {vector[keyMap[ind]] = val} );
  transformedArr.push(vector);
  vertices = vertices.slice(3);
}

如果你有这方面的测试数据就好了,但我认为类似于下面的东西应该可以很好地工作

const keysMap = ['x', 'y', 'z']
let transformedArr = [];
let vertices = [0.555,0.323,298,0.585,0.353,298,0.615,0.373,298...continuous]
while (vertices.length) {
  vector = {};
  vertices.slice(o, 2).forEach( (val, ind) => {vector[keyMap[ind]] = val} );
  transformedArr.push(vector);
  vertices = vertices.slice(3);
}
var-nverts=[];
对于(var i=0;i
var nverts=[];
对于(var i=0;我希望它能有所帮助

var vertices = [
    0.555,0.323,298,
    0.585,0.353,297,
    0.615,0.373,296,
    0.123,0.456,295,
    0.789,0.012,294,
    0.234,0.569,293];

if (vertices.length % 3 === 0) {
    var result = [];
    for(var i=0; i < vertices.length; i+=3) {
        result.push({ x: vertices[i], y: vertices[i+1], z: vertices[i+2] });
    }
    console.table(result);
}
var顶点=[
0.555,0.323,298,
0.585,0.353,297,
0.615,0.373,296,
0.123,0.456,295,
0.789,0.012,294,
0.234,0.569,293];
如果(顶点长度%3==0){
var结果=[];
对于(变量i=0;i
希望能有所帮助

var vertices = [
    0.555,0.323,298,
    0.585,0.353,297,
    0.615,0.373,296,
    0.123,0.456,295,
    0.789,0.012,294,
    0.234,0.569,293];

if (vertices.length % 3 === 0) {
    var result = [];
    for(var i=0; i < vertices.length; i+=3) {
        result.push({ x: vertices[i], y: vertices[i+1], z: vertices[i+2] });
    }
    console.table(result);
}
var顶点=[
0.555,0.323,298,
0.585,0.353,297,
0.615,0.373,296,
0.123,0.456,295,
0.789,0.012,294,
0.234,0.569,293];
如果(顶点长度%3==0){
var结果=[];
对于(变量i=0;i
在外部for循环中遍历所有。在内部for循环中声明一个临时值并通过计数器运行3次。临时值将是3个值的对象。每次将其转储到新数组。在外部for循环中遍历所有。在内部for循环中声明一个临时值并通过计数器运行3次。临时值将是3个值的对象。每次将其转储到新数组。我相信OP试图转换成3d向量对象,即{x,y,z}。我相信OP试图转换成3d向量对象,即{x,y,z}。谢谢@Faheem的快速回复。发挥魅力。我忘了我们实际上可以推x:,y:和z:以及值..愚蠢的我!!@SIM,如果数组中的元素数不是3的倍数怎么办。例如
[2.3,4.5,6.7,9.2]
,那么在这种情况下您将得到
[{x:2.3,y:4.5,z=6.7},{x:9.2,y:undefined,z:undefined}]
。如果可以,那么没问题,否则您需要在代码中进行一些简单的检查,以放置默认值,如
0.0
等。如果
未定义的
值是否抛出错误,则它基于JS库。@RishikeshAgrawani:谢谢,但这里我的数组将始终是3的倍数,因为我是在3d中绘制的,并且是t上的单点视口将有3个代表x、y和z的值。我希望我正在创建sense@RishikeshAgrawani:现在我关心的是,我将得到一个简化的对象数组,比如16个x、y、z对象,每个对象都有key:value对。如何再次将其转换回一维数组,与作为输入传递的数组相同earlier@SIM,检查回答。我添加了一行新行,将数组改回1D。感谢@Faheem的快速回复。发挥魅力。我忘了我们实际上可以推x:,y:和z:以及值..dumb me!!@SIM,如果数组中的元素数不是3的倍数怎么办。例如
[2.3,4.5,6.7,9.2]
在本例中,您将得到
[{x:2.3,y:4.5,z=6.7},{x:9.2,y:undefined,z:undefined}]
。如果可以,那么没问题,否则您需要在代码中进行一些简单的检查,以放置默认值,如
0.0
等。如果
未定义的
值是否抛出错误,则它基于JS库。@RishikeshAgrawani:谢谢,但这里我的数组将始终是3的倍数,因为我是在3d中绘制的,并且是t上的单点视口将有3个代表x、y和z的值。我希望我正在创建sense@RishikeshAgrawani:现在我关心的是,我将得到一个简化的对象数组,比如16个x、y、z对象,每个对象都有key:value对。如何再次将其转换回一维数组,与作为输入传递的数组相同earlier@SIM,检查回答。我添加了一行新行,将数组改回1D。感谢@manthrax,这行也能正常工作。感谢您坚持使用三个JS上下文。接受的答案也是一样的,在推送数据简化JS后,会看到使用哪一行。再次感谢各位:)Happy THREE.js'ing!关于已接受的答案的快速说明。.如果接收类期望使用真正的Vector3,则推送裸对象而不是新的Vector3对象可能会导致未定义的行为!但这可能很好。:)谢谢@manthrax,这一个也起作用。感谢您坚持使用三个JS上下文。接受的答案也是一样的,在推送数据以简化js后,将看到使用哪一个。再次感谢大家:)三点快乐!关于已接受答案的快速注释。。如果接收类需要真正的Vector3,则推送裸对象而不是新的Vector3对象可能会导致未定义的行为!但可能没问题……)内部逻辑与公认答案相同,只是消除了for循环,所以它也可以工作。尽管@Neo Choi的内部逻辑与公认的答案相同,但除了消除for循环之外,所以它也可以工作。谢谢@Neo Choi