感谢您的阅读。
假设我有这组输入:
const S = "1C 5A 10F 1F 5E"; //Int are rows and Char are columns (ie. seat in a movie theater)
const N = 10; // Number between 1 to 100000
const Ob = { "A": 1, "B": 2, "C": 3,"D": 5, "E": 7, "F": 11, "G": 13,"H": 17, "J": 19, "K": 23};
我想创建一个数组大小 N
其中:
Int
值减 1 就是数组中的位置。Char
用于获取Ob
中的值并将其添加到Array中其对应的Int
的位置.如果
Int
的值重复(同一行中的值),该位置的数组中的值应将前一个值与Ob
中的字符的新值相乘。
例如(给定上面提供的值):
- 值
1C
来自S
应该分配C
的值来自Ob
在数组的位置 0 中,使得
A[0] === 3;
- 如果我们对上述所有输入执行此操作,结果应为
A = [33, 0, 0, 7, 0, 0, 0, 0, 0, 11]
我已经成功地用下面的代码做到了
//Resulting Array
A = Array(N).fill(0)
//Get string Int and Char into two arrays
let Columns = S.replace(/\d/g,'').split(' ');
let Rows = S.replace(/[A-K]/g,'').split(' ').map(Number);
//Replace values in A based on Rows and Columns values
Rows.forEach((value,i) => {A[value - 1] === 0 ? arrA[value - 1] = Ob[Columns[i]] : A[value - 1] = Ob[Columns[i]] * A[value - 1]});
但我确信必须有一种更有效的方法在 char
中仅循环一次( char
到 S
) 。就像下面的代码一样。我的主要问题是管理 Int
的位数(即 1、10、100、1000、10000 等),如果按字符循环字符串,则使用空格作为分隔符。
A = [...S].forEach(char => {});
感谢您的帮助。
最佳答案
您可以拆分字符串,通过获取整数和字母部分来减少位置,并分配索引或 1 处的值相乘的结果。
const
data = "1C 5A 10F 1F 5E",
length = 10,
object = { "A": 1, "B": 2, "C": 3, "D": 5, "E": 7, "F": 11, "G": 13, "H": 17, "J": 19, "K": 23 },
result = data
.split(' ')
.reduce(
(r, position) => {
var [i, key] = position.match(/\d+|\D/g);
i--;
r[i] = (r[i] || 1) * object[key];
return r;
},
Array.from({ length }, _ => 0)
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 字符串元素和对象键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60712720/