使用序列输出从数组的每个数组中获取数据
Get data from each array of array with sequence output
我正在尝试获取每个数组数组的序列索引,就像我有一个数组元素,而 5 个数组有多个元素,我想获取每个数组的第一个索引,然后是第二个,依此类推。
下面是我的数组数据
const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
和我预期的结果 [1,3,12,9,2,8,13,10,4,7,6]
给我某种解决方案来解决我的问题
您需要跟踪 index
,它定义了每次迭代中要获取的元素的位置。
使用 while
循环,当在某个 index
.
的任何数组中没有剩余元素时,该循环将终止
使用.map
获取索引
处每个数组中的元素列表
使用 .filter
删除此列表中的 undefined
个元素,以防其中一个数组在索引
处没有元素
使用.isEmpty
检查这个列表是否为空,然后终止
const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
let res = [], index = 0;
while(true) {
const elementsAtIndex = _.filter(
_.map(arrData, e => e[index]),
e => e!==undefined
);
if(_.isEmpty(elementsAtIndex)) break;
res = [...res, ...elementsAtIndex];
index++;
}
console.log(...res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>
由于是嵌套数组,你可以循环检查每个嵌套数组的第一个元素是否未定义。如果没有,您可以将其推入结果数组。我为您的参考编写了函数。请检查
const arrData = [[1, 2, 4, 6], [3, 8, 7], [12, 13], [], [9, 10]];
function sorter(arr) {
var result = [];
if (arr.length > 0) {
for (var i = 0; i < arr.length; i++) {
if (arr[i].length > 0) {
if (arr[i][0] !== undefined) {
result.push(arr[i][0]);
}
}
}
}
return result;
}
console.log(sorter(arrData));
希望这就是您所期望的!如果您需要说明,请联系我。
以下可能有效:
const src = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]],
pickByOne = arr => {
const result = [],
{length} = arr.flat()
while(result.length < length){
for(a of arr){
a.length && result.push(a.shift())
}
}
return result
}
console.log(pickByOne(src))
您还可以使用 lodash
中的 zip。由于该函数采用一系列参数并且您有一个数组,因此您需要使用 ...
展开数组
const _ = require("lodash");
const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
const z = _.zip(...arrData)
这将为您提供以下结果:
[
[ 1, 3, 12, undefined, 9 ],
[ 2, 8, 13, undefined, 10 ],
[ 4, 7, undefined, undefined, undefined ],
[ 6, undefined, undefined, undefined, undefined ]
]
您已经可以看到它是按照您想要的顺序排列的。现在清理一下。您可以使用最简单形式的 flatMap
来展平数组。
// lodash
const fm = _.flatMap(z)
// or with Array.prototype.flat()
const fm = z.flat()
这将为您提供一个数组。
[
1, 3, 12,
undefined, 9, 2,
8, 13, undefined,
10, 4, 7,
undefined, undefined, undefined,
6, undefined, undefined,
undefined, undefined
]
现在您只需要通过过滤(保留)所有不是 undefined
的元素来删除所有 undefined
元素。
// lodash
_.filter(fm, _.negate(_.isUndefined))
你得到了最终结果。
[1, 3, 12, 9, 2, 8, 13, 10, 4, 7, 6]
有很多方法可以解决这个问题,因此您需要根据您的具体情况做出决定,并平衡简单性、代码易读性、效率等。
使用Array.map()
求出所有子数组的长度,求出最长的子数组长度,Math.max()
。使用Array.from()
创建长度最长的数组。对于创建的数组中的每个索引,使用 Array.flatMap()
从原始子数组中获取所有项目。如果该项目是 undefined
,请使用 Nullish coalescing operator (??) 将其替换为一个空数组,Array.flatMap()
在展平结果数组时将忽略它。使用 Array.flat()
展平 Array.from()
的输出以获得单个数组。
const fn = arr =>
Array.from({ length: Math.max(...arr.map(o => o.length)) }, (_, i) =>
arr.flatMap(o => o[i] ?? [])
).flat();
const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
const result = fn(arrData);
console.log(result);
没有任何运算符的简单的看起来像....
const ipArr = [ [1, 2, 4, 6], [8, 9, 10], [], [12], [14, 15], [] ]
let maxLength = 0
for (let i = 0; i < ipArr.length; i++) {
if (ipArr[i].length > maxLength) maxLength = ipArr[i].length
}
const opArr = []
for (let j = 0; j < maxLength; j++) {
for (let k = 0; k < ipArr.length; k++) {
if (ipArr[k][j]) opArr.push(ipArr[k][j])
}
}
console.log('opArr = ', opArr)
请尝试我的以下解决方案,它可能会解决您的问题
let data = [[], [], [1, 2, 4, 6], [8, 9, 10], [], [12], [14, 15], []], index = 0;
data = data.filter(o => o.length != 0)
const result = [];
for (i = 0; i < data.length; i++) {
if (data[i].length > index) {
index = data[i].length
}
if (data[i].length > 0) {
for (j = 0; j < index; j++) {
if (data[j][i] != undefined) {
result.push(data[j][i]);
}
}
}
}
console.log("Result", result);
我正在尝试获取每个数组数组的序列索引,就像我有一个数组元素,而 5 个数组有多个元素,我想获取每个数组的第一个索引,然后是第二个,依此类推。
下面是我的数组数据
const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
和我预期的结果 [1,3,12,9,2,8,13,10,4,7,6]
给我某种解决方案来解决我的问题
您需要跟踪
index
,它定义了每次迭代中要获取的元素的位置。使用
的任何数组中没有剩余元素时,该循环将终止while
循环,当在某个index
.使用
处每个数组中的元素列表.map
获取索引使用
处没有元素.filter
删除此列表中的undefined
个元素,以防其中一个数组在索引使用
.isEmpty
检查这个列表是否为空,然后终止
const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
let res = [], index = 0;
while(true) {
const elementsAtIndex = _.filter(
_.map(arrData, e => e[index]),
e => e!==undefined
);
if(_.isEmpty(elementsAtIndex)) break;
res = [...res, ...elementsAtIndex];
index++;
}
console.log(...res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>
由于是嵌套数组,你可以循环检查每个嵌套数组的第一个元素是否未定义。如果没有,您可以将其推入结果数组。我为您的参考编写了函数。请检查
const arrData = [[1, 2, 4, 6], [3, 8, 7], [12, 13], [], [9, 10]];
function sorter(arr) {
var result = [];
if (arr.length > 0) {
for (var i = 0; i < arr.length; i++) {
if (arr[i].length > 0) {
if (arr[i][0] !== undefined) {
result.push(arr[i][0]);
}
}
}
}
return result;
}
console.log(sorter(arrData));
希望这就是您所期望的!如果您需要说明,请联系我。
以下可能有效:
const src = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]],
pickByOne = arr => {
const result = [],
{length} = arr.flat()
while(result.length < length){
for(a of arr){
a.length && result.push(a.shift())
}
}
return result
}
console.log(pickByOne(src))
您还可以使用 lodash
中的 zip。由于该函数采用一系列参数并且您有一个数组,因此您需要使用 ...
const _ = require("lodash");
const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
const z = _.zip(...arrData)
这将为您提供以下结果:
[
[ 1, 3, 12, undefined, 9 ],
[ 2, 8, 13, undefined, 10 ],
[ 4, 7, undefined, undefined, undefined ],
[ 6, undefined, undefined, undefined, undefined ]
]
您已经可以看到它是按照您想要的顺序排列的。现在清理一下。您可以使用最简单形式的 flatMap
来展平数组。
// lodash
const fm = _.flatMap(z)
// or with Array.prototype.flat()
const fm = z.flat()
这将为您提供一个数组。
[
1, 3, 12,
undefined, 9, 2,
8, 13, undefined,
10, 4, 7,
undefined, undefined, undefined,
6, undefined, undefined,
undefined, undefined
]
现在您只需要通过过滤(保留)所有不是 undefined
的元素来删除所有 undefined
元素。
// lodash
_.filter(fm, _.negate(_.isUndefined))
你得到了最终结果。
[1, 3, 12, 9, 2, 8, 13, 10, 4, 7, 6]
有很多方法可以解决这个问题,因此您需要根据您的具体情况做出决定,并平衡简单性、代码易读性、效率等。
使用Array.map()
求出所有子数组的长度,求出最长的子数组长度,Math.max()
。使用Array.from()
创建长度最长的数组。对于创建的数组中的每个索引,使用 Array.flatMap()
从原始子数组中获取所有项目。如果该项目是 undefined
,请使用 Nullish coalescing operator (??) 将其替换为一个空数组,Array.flatMap()
在展平结果数组时将忽略它。使用 Array.flat()
展平 Array.from()
的输出以获得单个数组。
const fn = arr =>
Array.from({ length: Math.max(...arr.map(o => o.length)) }, (_, i) =>
arr.flatMap(o => o[i] ?? [])
).flat();
const arrData = [[1,2,4,6],[3,8,7],[12,13],[],[9,10]];
const result = fn(arrData);
console.log(result);
没有任何运算符的简单的看起来像....
const ipArr = [ [1, 2, 4, 6], [8, 9, 10], [], [12], [14, 15], [] ]
let maxLength = 0
for (let i = 0; i < ipArr.length; i++) {
if (ipArr[i].length > maxLength) maxLength = ipArr[i].length
}
const opArr = []
for (let j = 0; j < maxLength; j++) {
for (let k = 0; k < ipArr.length; k++) {
if (ipArr[k][j]) opArr.push(ipArr[k][j])
}
}
console.log('opArr = ', opArr)
请尝试我的以下解决方案,它可能会解决您的问题
let data = [[], [], [1, 2, 4, 6], [8, 9, 10], [], [12], [14, 15], []], index = 0;
data = data.filter(o => o.length != 0)
const result = [];
for (i = 0; i < data.length; i++) {
if (data[i].length > index) {
index = data[i].length
}
if (data[i].length > 0) {
for (j = 0; j < index; j++) {
if (data[j][i] != undefined) {
result.push(data[j][i]);
}
}
}
}
console.log("Result", result);