将所有函数参数值转换为一个展平数组,以避免数组在另一个数组中

时间:2016-02-08 20:02:46

标签: javascript arrays

我正在使用一个函数,我需要在一个数组中转换所有函数的参数,即使一个参数是一个数组(或者带有值列表的东西)。 我需要PHP中的array_merge() ,但不需要密钥,只需要我想要的值。

编辑1:
正在寻找如何将对象arguments转换为数组。我需要将所有值作为参数传递给单个数组。如果一个或多个参数是数组或对象,则需要将其值合并到一个数组。就像提供的例子一样。

例如:
foo('bar', function, [1,2,3], [NodeList], window);
array => ['bar',功能,1,2,3,< HTMLElement>,< HTMLElement>,窗口]

注意[NodeList],它必须变成HTMLElements。

到目前为止:
我已经在下面完成了这个功能,但我想知道它是否更好。任何意见/提示表示赞赏。

function toArray(obj) {
  var k = Object.keys(obj);
  var i = 0, l = k.length;
  if (isString(obj) || l == 0 || obj === window) {
    return obj;
  } else {
    var objs = [];
    while (i < l) {
      objs = objs.concat(toArray(obj[k[i]]));
      i++;
    }
    return objs
  }
}
function isString(obj){
  return (typeof obj === 'string' || obj instanceof String);
}

编辑1:
用法:

var arg1 = 'bar',
    arg2 = [1,2,3],
    arg3 = document.querySelectorAll('body');

foo(arg1, arg2, arg3) {
   var myArray = toArray(arguments);
   //myArray: ['bar', 1, 2, 3, <body>]
}

1 个答案:

答案 0 :(得分:2)

使用关键字arguments

http://www.w3schools.com/js/tryit.asp?filename=tryjs_function_arguments

&#13;
&#13;
function findMax() {
  var i;
  var max = -Infinity;
  for (i = 0; i < arguments.length; i++) {
    if (arguments[i] > max) {
      max = arguments[i];
    }
  }
  return max;
}
document.getElementById("demo").innerHTML = findMax(4, 5, 6);
&#13;
<p>Finding the largest number.</p>
<p id="demo"></p>
&#13;
&#13;
&#13;

修改

这就是你压扁阵列的方法。

&#13;
&#13;
var arg1 = document.querySelectorAll('p');
var arg2 = 3;
var arg3 = [1, 2, [3, 2, 3, [45, arg1]]];
var arg4 = function() {};
var arg5 = {
  a: {
    b: 3,
    c: 2
  }
};
var arg6 = window;

function flatten() {
    /*gets all the arguments past in*/
    var arrays = arguments;
    var last = 0;
    /*flattens the array*/
    while (arrays.length != last) {
      last = arrays.length;
      arrays = [].concat.apply([], arrays);
    }
    /*maps all nodelist to an array*/
    arrays = arrays.map(function(obj) {
      var arg1 = [];
      if (isNodeList(obj)) {
        [].forEach.call(obj, function(node) {
          arg1.push(node);
        });
        return arg1;
      } else {
        return obj;
      }
    });
    /*flattens all node list arrays*/
    last = 0;
    while (arrays.length != last) {
      last = arrays.length;
      arrays = [].concat.apply([], arrays);
    }
    /*Returns unique array*/
    return unique(arrays);
  }
  /*Makes array unique*/

function unique(a) {
  return a.reduce(function(p, c) {
    if (p.indexOf(c) < 0) p.push(c);
    return p;
  }, []);
}

function isNodeList(obj) {
  var objType = {}.toString.call(obj);
  return (objType === '[object NodeList]' ||
    objType === '[object HTMLCollection]' ||
    objType === '[object Object]' && /^\s?function/.test(obj.item)) && obj.length; // returns length of nodeList if true      
};

document.getElementById('r').innerHTML = flatten(arg1, arg2, arg3, arg4, arg5, arg6);
&#13;
<p id="s">

</p>
<p>

</p>
<span id='r'></span>
&#13;
&#13;
&#13;