我有三个数据源,返回数量不等的数组。我想从这些结果中创建一组结果,同时限制我可以返回的数量。
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"]