我有一个包含文件名列表的数组:
var files = ['home_01.ai','home_02.ai','home_03.ai','imprint_01.ai','imprint_02.ai']
我想要做的是将此数组重组为一个多维数组,该数组将每个文件组合在一起,并使用相同的前缀。在这种情况下:
var firstArray = ['home_01.ai','home_02.ai','home_03.ai'], /*home*/
secondArray = ['imprint_01.ai','imprint_02.ai']; /*imprint*/
如果我的文件数组中可以有任意长度的可变数量的前缀,我怎么能实现呢?
答案 0 :(得分:1)
您可以遍历数组并将文件名拆分为' _'获取prifix,然后将这些文件名添加到正确的数组中,由前缀索引。
var files = ['home_01.ai','home_02.ai','home_03.ai','imprint_01.ai','imprint_02.ai'];
var result = {};
for (var i = 0; i < files.length; i++)
{
if (files[i].indexOf('_') < 0)
{
console.log("No prefix detected in '" + files[i] + "'.");
continue;
}
var prefix = files[i].split('_')[0];
if (!result[prefix])
result[prefix] = [];
result[prefix].push(files[i]);
}
console.dir(result);
答案 1 :(得分:0)
我错过了你可能有另外一个前缀。更新以使用任何前缀。
function splitFilesIntoTypes(_files, cb) {
var result = [];
// loop through the array
_files.map(function(a, b){
if(!result[a.split('_')[0]])
result[a.split('_')[0]] = [];
result[a.split('_')[0]].push(a);
});
return result
}
var files = ['another_01.ai','home_01.ai','home_02.ai','home_03.ai','imprint_01.ai','imprint_02.ai'];
console.log(splitFilesIntoTypes(files));
假设您只有两种类型的名称(主页_...和印记_...)。我做了这个功能把它分成两个数组。
// function takes array and returns two array to callback function
function splitFilesIntoTypes(_files, cb) {
// if you have only two types of names
var _home = [], _imprint = [];
// loop through the array
_files.map(function(a, b){
if(a.split('_')[0] === 'home') _home.push(a);
if(a.split('_')[0] === 'imprint') _imprint.push(a);
});
if(typeof cb === "function")
cb(_home, _imprint);
}
var files = ['home_01.ai','home_02.ai','home_03.ai','imprint_01.ai','imprint_02.ai'];
splitFilesIntoTypes(files, function(firstArray, secondArray) {
console.log(firstArray);
console.log(secondArray);
});
答案 2 :(得分:0)
您可以使用AlaSQL JavaScript数据处理库。
以下是您的问题的解决方案:
var res = alasql('COLUMN OF SELECT ARRAY(_) FROM ? \
GROUP BY _->split("_")->0',[files]);
此语句返回按前缀分组的数组数组:
[ [ 'home_01.ai', 'home_02.ai', 'home_03.ai' ],
[ 'imprint_01.ai', 'imprint_02.ai' ] ]
下面:
免责声明:我是AlaSQL的作者。
答案 3 :(得分:0)
var files = ['home_01.ai', 'home_02.ai', 'home_03.ai', 'imprint_01.ai', 'imprint_02.ai'];
var result = files.reduce(function(prev, curr) {
var index = curr.indexOf('_01.');
if (index !== -1) {
prev.push(index);
}
return prev;
}, []).map(function(index) {
return files.splice(0, index - 1);
});
document.body.textContent = JSON.stringify(result);
&#13;
请注意,此答案假定files
已按字母顺序排序。
答案 4 :(得分:0)
我使用与Maxali相同的方法,但使用名为lodash的javascript库。它对于过滤数组和对象非常有用,无需编写自己的过滤代码。
我没有保存到二维数组,而是使用数组作为值创建一个JSON对象,因为我发现在我的javascript中可以读取和理解的键很有用。看看lodash,它可能对你今天所需要的东西有些过分,但明天可能会有用。
<!DOCTYPE html>
<html>
<head>
<script src="https://raw.github.com/lodash/lodash/4.0.0/dist/lodash.js"></script>
<!-- downloaded from https://lodash.com -->
<script>
var files = ['home_01.ai', 'home_02.ai', 'home_03.ai', 'imprint_01.ai', 'imprint_02.ai'];
var getPrefixFn = function(file) {
return file.substr(0, file.indexOf('_'));
};
var prefixes = _.map(files, getPrefixFn);
var uniquePrefixes = _.uniq(prefixes);
var groupedFiles = {};
_(files).forEach(function(file) {
_(uniquePrefixes).forEach(function(prefix) {
if (groupedFiles[prefix] == null) groupedFiles[prefix] = []; // create a new group if it doesnt exist
if (file.indexOf(prefix) === 0) {
groupedFiles[prefix].push(file);
}
});
});
console.log(groupedFiles);
</script>
</head>
<body>
</body>
</html>
如果二维数组更容易处理,那么试试这个:
<!DOCTYPE html>
<html>
<head>
<script src="https://raw.github.com/lodash/lodash/4.0.0/dist/lodash.min.js"></script>
<!-- downloaded from https://lodash.com -->
<script>
var files = ['home_01.ai', 'home_02.ai', 'home_03.ai', 'imprint_01.ai', 'imprint_02.ai'];
var getPrefixFn = function(file) {
return file.substr(0, file.indexOf('_'));
};
var prefixes = _.map(files, getPrefixFn);
var uniquePrefixes = _.uniq(prefixes);
var groupedFiles = [];
for (var index = 0, length = uniquePrefixes.length; index < length; index += 1) {
var prefix = uniquePrefixes[index];
groupedFiles[index] = [];
for (var fileIndex = 0, fileLength = files.length; fileIndex < fileLength; fileIndex += 1) {
if (files[fileIndex].indexOf(prefix) === 0) {
groupedFiles[index].push(files[fileIndex]);
}
};
}
console.log(groupedFiles);
</script>
</head>
<body>
</body>
</html>