添加多个有限制的数组



我有三个数据源,返回数量不等的数组。我想从这些结果中创建一组结果,同时限制我可以返回的数量。

var array1 = ["one"];
var array2 = ["two", "three", "four"];
var array3 = ["five", "six", "seven"];

我只想带回前 6 个结果,但它们可以按顺序来自三个数组中的任何一个。从上面的例子中,我希望看到"one, two, three, four, five, six"返回。

我使用多个 for 循环和多个 if 语句来实现这一点:

var tList = [];
var tCount = 0;
var tLimit = 5;
for (i = 0; i < array1.length; i++) {
    if (tCount <= tLimit) {
        tList.push(array1[i]);
        tCount++;
    }
}
for(i = 0; i < array2.length; i++) {
    if (tCount <= tLimit) {
        tList.push(array2[i]);
        tCount++;
    }
}
for(i = 0; i < array3.length; i++) {
    if (tCount <= tLimit) {
        tList.push(array3[i]);
        tCount++;
    }
}

然而,这似乎不是最好或最整洁的方法,有没有更好的方法来实现相同的目标? 不使用像下划线这样的插件。

这里有一个可以玩的JSFIDDLE:https://jsfiddle.net/sju7g5dp/

concat() 方法用于连接两个或多个arrays

此方法不会更改现有的arrays,但返回一个新的array,其中包含连接的arrays的值。

var array1 = ["one"];
var array2 = ["two", "three", "four"];
var array3 = ["five", "six", "seven"];
var result=array1.concat(array2,array3);
console.log(result);

然后简单地切片,

result.slice(0,5)

function take(limit) {
  var result = []
  for (var i = 0, args = arguments.length - 1; result.length < limit && i < args; i++)
    for (var j = 0, length = arguments[i].length; result.length < limit && j < length; j++)
      result.push(arguments[i][j])
  return result
}
console.log(take(5, [1,2,3], [4,5], [6,7]))
  /* output: [ 1, 2, 3, 4, 5 ] */

for 循环可能不令人赏心悦目,但它可以满足您的需求。 从任意数量的数组源中获取多达 N 个元素。

这是一种使用 ES6 生成器的方法。

首先,编写一个从数组数组生成元素的生成器。

function *elts(arrays) { 
  for (let array of arrays) yield *array; 
}

接下来,take生成器从迭代器中生成前 n 个结果。

function *take(n, it) { 
  for (let x of it) if (n--) yield x; else break; 
}

现在

var array1 = ["one"];
var array2 = ["two", "three", "four"];
var array3 = ["five", "six", "seven"];
var arrays = [array1, array2, array3];
console.log(Array.from(take(6, elts(arrays))));
> ["one", "two", "three", "four", "five", "six"]

最新更新