如何使用扩展或映射运算符将此公式应用于 Uint16 对数组?

Posted

技术标签:

【中文标题】如何使用扩展或映射运算符将此公式应用于 Uint16 对数组?【英文标题】:How to use a spread or map operator to apply this formula to an array of Uint16 pairs? 【发布时间】:2021-02-10 08:16:45 【问题描述】:

我一直在努力更好地理解扩展和/或映射运算符,特别是如何使用它来应用数学。

我有一个由两个 Uint16 数字对组成的数组,如下所示:

let randomPairs = [
  [ 37096, 65104 ], [ 62271, 3432 ],  [ 1191, 43320 ],  [ 5388, 16819 ],
  [ 52224, 52222 ], [ 61913, 48798 ], [ 52950, 18227 ], [ 23232, 43931 ],
  [ 14995, 45924 ], [ 20609, 46597 ], [ 2392, 52582 ],  [ 7050, 51498 ],
  [ 34253, 11210 ], [ 43376, 41964 ], [ 63238, 34740 ], [ 63254, 56620 ]
]

我想使用展开或映射运算符将以下公式应用于每一对。该公式将这对组合成 Uint32,然后将其转换为 0-1 之间的浮点数。

(((2**16) * u1) + u2) / ((2 ** 32) - 1)

其中u1 代表一对中的第一项,u2 代表一对中的第二项。

我真的不知道该怎么做,但这是我的代码,它采用数组并使用 for 循环应用公式:

let i,j,temparray,chunk = 2, u1, u2
for (i=0,j=randomPairs.length; i<j; i+=chunk) 

    temparray = randomPairs.slice(i,i+chunk);
    u1 = temparray[0]
    u2 = temparray[1]
    let float = (((2**16) * u1) + u2) / ((2 ** 32)  - 1)
    
    console.log(float)

如何使用扩展或映射运算符将randomPairs 数组转换为每对所需浮点数的数组?

如果Float32Array() 可以以某种方式使用,我也很在意。

【问题讨论】:

你不能用map方法吗? 是的,可能,但我对两者都是新手。我已经更新了我的问题.. 你想要的是一个浮点值数组,对应于将每一对插入公式的结果,对吧?如果是这样,我将使用 map 编写代码作为答案。 是的,这就是我要找的东西 【参考方案1】:

如果要对数组中的每个元素应用操作,可以使用map 方法:

let randomPairs = [
  [ 37096, 65104 ], [ 62271, 3432 ],  [ 1191, 43320 ],  [ 5388, 16819 ],
  [ 52224, 52222 ], [ 61913, 48798 ], [ 52950, 18227 ], [ 23232, 43931 ],
  [ 14995, 45924 ], [ 20609, 46597 ], [ 2392, 52582 ],  [ 7050, 51498 ],
  [ 34253, 11210 ], [ 43376, 41964 ], [ 63238, 34740 ], [ 63254, 56620 ]
]

let floats = randomPairs.map(p => 
    return (((2**16) * p[0]) + p[1]) / ((2 ** 32)  - 1);
);

console.log(floats);

或者,如果您只想console.log 输出并且不需要结果浮点值的数组,则可以使用forEach 方法。

【讨论】:

太棒了,这正是我所需要的。数组操作不是最容易掌握的,所以我真的很感激!【参考方案2】:

我相信这就是你想要的:)

myPairs.map(pair => 
const [u1, u2] = pair;

return (((2**16) * u1) + u2) / ((2 ** 32)  - 1);
)

【讨论】:

不需要额外的变量声明,你也可以直接解构``` randomPairs.forEach(([u1, u2]) => console.log(u1, u2) ); ```随意用地图替换它。 你是对的。我这样做是为了让 OP 可以更好地理解地图功能。【参考方案3】:

下面是一个例子,展示了如何使用扩展运算符 map 函数:

let randomPairs = [
  [ 37096, 65104 ], [ 62271, 3432 ],  [ 1191, 43320 ],  [ 5388, 16819 ],
  [ 52224, 52222 ], [ 61913, 48798 ], [ 52950, 18227 ], [ 23232, 43931 ],
  [ 14995, 45924 ], [ 20609, 46597 ], [ 2392, 52582 ],  [ 7050, 51498 ],
  [ 34253, 11210 ], [ 43376, 41964 ], [ 63238, 34740 ], [ 63254, 56620 ]
]

function foo(u1, u2) 
  console.log((((2**16) * u1) + u2) / ((2 ** 32)  - 1));


randomPairs.map(e => foo(...e));

【讨论】:

以上是关于如何使用扩展或映射运算符将此公式应用于 Uint16 对数组?的主要内容,如果未能解决你的问题,请参考以下文章

想用C#做一个类似于excel里的公式库以及公式的运算模块,可以自定义函数,并可以解析公式并运算

扩展(映射)元组类型

ES6 扩展运算符

数字电路与系统-逻辑运算与简化(常用三个公式)

Google表格上的标准格式帮助

如何将此 Boost ASIO 示例应用于我的应用程序