将函数参数拆分为空?

时间:2018-10-31 23:04:45

标签: javascript

说我的函数称为

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]

我已经指出了我的代码在哪里中断了。任何对此提出的建议将不胜感激

8 个答案:

答案 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值后没有非空值,则内部数组为空。