Javascript - 根据前缀重构字符串数组

时间:2016-01-20 09:12:56

标签: javascript arrays string object

我有一个包含文件名列表的数组:

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*/

如果我的文件数组中可以有任意长度的可变数量的前缀,我怎么能实现呢?

5 个答案:

答案 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' ] ]

下面:

  • COLUMN OF - 仅返回查询的第一列
  • SELECT ... FROM? GROUP BY ... - 选择陈述
  • ARRAY(_) - 数组记录
  • FROM? - 从参数[files]
  • 查询
  • GROUP BY - &gt;拆分(&#34; &#34;) - &gt; 0 - 取一个值,将其拆分为&#39; &#39;然后取第一个数组元素(类似于JS r.split(&#39; &#39;)[0]

免责声明:我是AlaSQL的作者。

答案 3 :(得分:0)

&#13;
&#13;
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;
&#13;
&#13;

请注意,此答案假定files已按字母顺序排序。

答案 4 :(得分:0)

我使用与Maxali相同的方法,但使用名为lodash的javascript库。它对于过滤数组和对象非常有用,无需编写自己的过滤代码。

我没有保存到二维数组,而是使用数组作为值创建一个JSON对象,因为我发现在我的javascript中可以读取和理解的键很有用。看看lodash,它可能对你今天所需要的东西有些过分,但明天可能会有用。

https://lodash.com/

<!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>