说我的函数称为
my_function(1, 2, 5, null, 4, null, 1, 3);
我想将其拆分为几个部分,一直到空为止。
这是我到目前为止所拥有的:
my_function = (...theArgs) => {
let _theArgs = [];
let _tempArray = [];
let j = 0;
for (let i = 0; i < theArgs.length; i++) {
if (theArgs[i] != null) {
_tempArray[j].push(theArgs[i]); //breaks here
} else {
_theArgs[j].push(_tempArray); //and here
_tempArray = [];
j++;
}
}
return _theArgs;
}
my_function(1, 2, 5, null, 4, null, 1, 3);
因此,我在这里尝试遍历传递给函数的每个参数,并将其拆分为2D数组。例如,my_function(1, 2, 5, null, 4, null, 1, 3);
将返回一个数组_theArgs
,其中_theArgs[0] = [1, 2, 5]
,_theArgs[1] = [4]
和_theArgs[2] = [1, 3]
我已经指出了我的代码在哪里中断了。任何对此提出的建议将不胜感激
答案 0 :(得分:3)
您可以搜索null
并将零件推入结果数组。
function fn(...args) {
var result = [],
r = 0,
l;
while ((l = args.indexOf(null, l)) !== -1) {
result.push(args.slice(r, l));
r = l + 1;
l += 2;
}
result.push(args.slice(r));
return result;
}
console.log(fn(1, 2, 5, null, 4, null, 1, 3));
答案 1 :(得分:1)
_tempArray[j].push()
失败,因为_tempArray[j]
不是数组。 _tempArray
最初是一个空数组,_tempArray[j]
中没有任何内容,因此您无法将其压入其中。我认为您只想要_tempArray.push(theArgs[i])
。
与_theArgs[j]
相同。
您还需要在函数末尾推入_theArgs
,以获取最后一个null
之后的参数。
my_function = (...theArgs) => {
let _theArgs = [];
let _tempArray = [];
for (let i = 0; i < theArgs.length; i++) {
if (theArgs[i] !== null) {
_tempArray.push(theArgs[i]);
} else {
_theArgs.push(_tempArray);
_tempArray = [];
}
}
if (_tempArray.length > 0) {
_theArgs.push(_tempArray);
}
return _theArgs;
}
console.log(my_function(1, 2, 5, null, 4, null, 1, 3));
答案 2 :(得分:0)
您似乎正在尝试对未定义的嵌套数组对象(通过push()
变量进行访问)调用j
。
考虑进行以下更改:
const my_function = (...theArgs) => {
let _theArgs = [];
let _tempArray = [];
for (let i = 0; i < theArgs.length; i++) {
if (theArgs[i] != null) {
// Push to _tempArray directly. No need to access via "j"
_tempArray.push(theArgs[i]);
} else {
// Push to _theArgs directly. No need to access via "j"
_theArgs.push(_tempArray);
_tempArray = [];
}
}
// Include last args items (if any after final null)
if(_tempArray.length > 0) {
_theArgs.push(_tempArray);
}
return _theArgs;
}
const result = my_function(1, 2, 5, null, 4, null, 1, 3);
console.log(result)
答案 3 :(得分:0)
j
索引使您失望;在两种情况下都将其删除(这是undefined
偏移量; push
将自动创建新元素)。
此外,您需要在返回结果之前附加最后的_tempArray
,以确保添加了最后一行。
这是一个更干净的版本,可完全避免使用索引:
const myFunction = (...args) => {
let row = [];
const result = args.reduce((a, e) => {
if (e === null) {
a.push(row);
row = [];
}
else {
row.push(e);
}
return a;
}, []);
return row.length ? result.concat([row]) : result;
}
console.log(myFunction(1, 2, 5, null, 4, null, 1, 3));
答案 4 :(得分:0)
这就是您所需要的:(由于您进行了推送,因此不需要变量j
)
my_function = (...theArgs) => {
let _theArgs = [];
let _tempArray = [];
for (let i = 0; i < theArgs.length; i++) {
if (theArgs[i] != null) {
_tempArray.push(theArgs[i]); //breaks here
} else {
_theArgs.push(_tempArray); //and here
_tempArray = [];
}
}
return _theArgs;
}
console.log(my_function(1, 2, 5, null, 4, null, 1, 3));
答案 5 :(得分:0)
Short and Sweet-不建议用于服务器端脚本,因为它的性能不如for循环解决方案,但可以为客户端节省一些带宽。还请注意,如前所述,此解决方案仅适用于数字,空值和现代浏览器。
my_function = (...theArgs) => {
var _theArgs = theArgs.toString().split(',,');
for(arg in _theArgs) {
_theArgs[arg] = _theArgs[arg].split(',').map(function(v) {return +v })
}
return _theArgs;
};
console.log(my_function(1, 2, 5, null, 4, null, 1, 3) );
答案 6 :(得分:0)
另一种解决方案:
function my_function(...args) {
var i = 0, temp = [], lastElt = null;
for (j = 0; j < args.length; j++) {
if (args[j] !== null) {
if (temp[i] === undefined) {
temp[i] = [];
}
temp[i].push(args[j]);
} else if (lastElt !== null) {
i++;
}
lastElt = args[j];
}
return temp;
}
var test = my_function(null, 1, 2, 5, null, null, 4, null, null, null, 1, 3);
console.log(test);
答案 7 :(得分:0)
如先前的答案中所述,问题是由于仅应使用一个(或第一个)维时处理第二维_theArgs
和_tempArray
引起的。
删除两次出现的[j]
和j++;
行将解决此问题,但需要修补代码以包含跟随最后一个null
参数的参数数组。
您可以使用Array.prototype.reduce
来避免显式循环代码和可能需要的修补程序:
const args2D = (...argList) =>
argList.reduce(
(result, arg) => {
if (arg === null){
result.push( [] );
}
else {
result[ result.length-1].push( arg);
}
return result;
},
[[]]
);
console.log( args2D(1, 2, 5, null, 4, null, 1, 3));
这种方法总是产生一个二维数组,如果参数列表为空,或者列表中的null
值后没有非空值,则内部数组为空。