如何根据 Javascript 的值将我的数组拆分为多个数组?
How I can split my array to multiple arrays based in a value with Javascript?
我有一个数组,我想根据值'Finished'将它拆分成多个数组,当我找到它时,我拆分数组。
我的代码是:
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404' , 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404','├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404','├─BROKEN─url213HTTP_404', 'Finished'
];
function chunkArray(array, size) {
let result = []
for (value of array) {
let lastArray = result[result.length - 1]
if (!lastArray || lastArray.length == size) {
result.push([value])
} else {
lastArray.push(value)
}
}
return result
}
const x = input.findIndex(element => element.indexOf('Finished') > -1)
console.log(chunkArray(input, x + 1));
当我 运行 我得到 :
但我希望结果是:
[["urlGettingF", "├─BROKEN─aquaHTTP_404", "├─BROKEN─url1HTTP_404", "ok", "urlok", "Finished"], ["urlGettingF2", "├─BROKEN─url1HTTP_404", "├─BROKEN─url21HTTP_404", "Finished"], ["urlGettingF3", "├─BROKEN─url3HTTP_404", "├─BROKEN─url213HTTP_404", "Finished"]]
当我找到Finished
时,我根据她的索引拆分我的数组,你可以在jsbin中看到我的代码
https://jsbin.com/benozuyutu/1/edit?js,console
我该如何解决?
您可能会找到 Finished
和 .reduce
的所有匹配项,然后通过 .slice
在找到的索引处对每个匹配项创建一个新数组:
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];
const finishedIndicies = input.reduce((a, item, i) => {
if (item === 'Finished') {
a.push(i);
}
return a;
}, []);
const chunked = finishedIndicies.map(
(sliceIndex, i, arr) => input.slice(arr[i - 1] === undefined ? 0 : arr[i - 1] + 1, sliceIndex + 1)
);
console.log(chunked);
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];
function chunkArray(arr) {
let result = [
[]
];
let index = 0;
arr.forEach((x, i) => {
result[index].push(x);
if ((i + 1) < arr.length && x.includes('Finished')) {
index++;
result[index] = [];
}
});
return result
}
console.log(chunkArray(input));
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished', 'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished', 'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished']
const res = input
.join(' ')
.split('Finished')
.map(item => item.split(' ').filter(item => item))
.filter(item => item.length)
.map(item => [...item, 'Finished'])
console.log(res)
您可以使用以下算法。
- 查找
indexOf('Finished')
- 使用
Array.splice
函数获取index
之前的值。 .splice
也更新现有数组。
- 执行上述操作直到
indexOf('Finished') > -1
- 最后,在
output array
中添加剩余的input array
let input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];
let output = [];
while (true) {
output.push(input.splice(0, input.indexOf('Finished') + 1));
if (input.indexOf('Finished') === -1) {
input.length && output.push(input); //to add all remaining values
break;
}
}
console.log(output);
您可以使用reduce
方法。在 reduce
方法中,需要检查要查找的关键字是否存在,如果存在则推入新创建的数组。否则,我们将推入现有数组:
let keywordToFind = 'urlGettingF';
const result = input.reduce((a, c) => {
(c.includes(keywordToFind)) ? a.push([c]) : a[a.length - 1].push(c);
return a;
}, []);
一个例子:
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404',
'├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];
let keywordToFind = 'urlGettingF';
const result = input.reduce((a, c) => {
(c.includes(keywordToFind)) ? a.push([c]) : a[a.length - 1].push(c);
return a;
}, []);
console.log(result);
我有一个数组,我想根据值'Finished'将它拆分成多个数组,当我找到它时,我拆分数组。
我的代码是:
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404' , 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404','├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404','├─BROKEN─url213HTTP_404', 'Finished'
];
function chunkArray(array, size) {
let result = []
for (value of array) {
let lastArray = result[result.length - 1]
if (!lastArray || lastArray.length == size) {
result.push([value])
} else {
lastArray.push(value)
}
}
return result
}
const x = input.findIndex(element => element.indexOf('Finished') > -1)
console.log(chunkArray(input, x + 1));
当我 运行 我得到 :
但我希望结果是:
[["urlGettingF", "├─BROKEN─aquaHTTP_404", "├─BROKEN─url1HTTP_404", "ok", "urlok", "Finished"], ["urlGettingF2", "├─BROKEN─url1HTTP_404", "├─BROKEN─url21HTTP_404", "Finished"], ["urlGettingF3", "├─BROKEN─url3HTTP_404", "├─BROKEN─url213HTTP_404", "Finished"]]
当我找到Finished
时,我根据她的索引拆分我的数组,你可以在jsbin中看到我的代码
https://jsbin.com/benozuyutu/1/edit?js,console
我该如何解决?
您可能会找到 Finished
和 .reduce
的所有匹配项,然后通过 .slice
在找到的索引处对每个匹配项创建一个新数组:
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];
const finishedIndicies = input.reduce((a, item, i) => {
if (item === 'Finished') {
a.push(i);
}
return a;
}, []);
const chunked = finishedIndicies.map(
(sliceIndex, i, arr) => input.slice(arr[i - 1] === undefined ? 0 : arr[i - 1] + 1, sliceIndex + 1)
);
console.log(chunked);
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];
function chunkArray(arr) {
let result = [
[]
];
let index = 0;
arr.forEach((x, i) => {
result[index].push(x);
if ((i + 1) < arr.length && x.includes('Finished')) {
index++;
result[index] = [];
}
});
return result
}
console.log(chunkArray(input));
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished', 'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished', 'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished']
const res = input
.join(' ')
.split('Finished')
.map(item => item.split(' ').filter(item => item))
.filter(item => item.length)
.map(item => [...item, 'Finished'])
console.log(res)
您可以使用以下算法。
- 查找
indexOf('Finished')
- 使用
Array.splice
函数获取index
之前的值。.splice
也更新现有数组。 - 执行上述操作直到
indexOf('Finished') > -1
- 最后,在
output array
中添加剩余的
input array
let input = ['urlGettingF', '├─BROKEN─aquaHTTP_404', '├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];
let output = [];
while (true) {
output.push(input.splice(0, input.indexOf('Finished') + 1));
if (input.indexOf('Finished') === -1) {
input.length && output.push(input); //to add all remaining values
break;
}
}
console.log(output);
您可以使用reduce
方法。在 reduce
方法中,需要检查要查找的关键字是否存在,如果存在则推入新创建的数组。否则,我们将推入现有数组:
let keywordToFind = 'urlGettingF';
const result = input.reduce((a, c) => {
(c.includes(keywordToFind)) ? a.push([c]) : a[a.length - 1].push(c);
return a;
}, []);
一个例子:
var input = ['urlGettingF', '├─BROKEN─aquaHTTP_404',
'├─BROKEN─url1HTTP_404', 'ok', 'urlok', 'Finished',
'urlGettingF2', '├─BROKEN─url1HTTP_404', '├─BROKEN─url21HTTP_404', 'Finished',
'urlGettingF3', '├─BROKEN─url3HTTP_404', '├─BROKEN─url213HTTP_404', 'Finished'
];
let keywordToFind = 'urlGettingF';
const result = input.reduce((a, c) => {
(c.includes(keywordToFind)) ? a.push([c]) : a[a.length - 1].push(c);
return a;
}, []);
console.log(result);