Sum对象具有相同的接口,但不相同

时间:2016-05-20 17:12:45

标签: javascript node.js

我正在尝试创建一个程序来根据我设置的规则检查文档的出现次数。在正则表达式的帮助下,我检查了一些字段,如果存在特定字段,我可以计算它的出现次数,或者我创建一个更深的扫描。这有点令人困惑,我不确切地知道如何解释。

我正在检查文本文件,但为了降低复杂性,我将使用数组。

我有以下数组:

let strings = [
  'COMPANY: NAME  ID: 12',
  'COMPANY: NAME  ID: 12',
  'COMPANY: NAME  ID: 12',
  'COMPANY: NAME2 ID: 10'
];

这是欲望输出:

[
  {
    "NAME": {
      "12": 3
    }
  },
  {
    "NAME2": {
      "10": 1
    }
  }
]

我的逻辑:

'use strict';

let patterns = [
  {
    'pattern': 'COMPANY:\\s*?([\\w]+)',
    'modifier': ''
  },
  {
    'pattern': 'ID:\\s*?([\\d]+)',
    'modifier': ''
  }
];

let strings = [
  'COMPANY: NAME  ID: 12',
  'COMPANY: NAME  ID: 12',
  'COMPANY: NAME  ID: 12',
  'COMPANY: NAME2 ID: 10'
];

var SUPER = [];
var _data = {};

for (let string of strings) {

	let i      = 0;
	let length = patterns.length
  var root   = _data;

  for (i; i < length; i++) {

    let item   = patterns[i];

    let regex  = new RegExp(item.pattern, item.modifier);
    let result = regex.exec(string);


    if (i < patterns.length -1) {

    	root = root[result[1]] = {};

    } else {
      root  = root[result[1]] = 1;





      SUPER.push(_data);
      _data = {};
    }
  }
}


console.log(JSON.stringify(SUPER, null ,2));

现在我有这个差距,我需要检查对象是否已经存在,如果是,我只是增加最后一项。

任何想法或建议??

感谢。

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

// This (big_hash) is where we will store the output
// Sample output:
// {
//   NAME: {
//     "12": 3
//   },
//   NAME2: {
//     "10": 1
//   }
// }
let big_hash = {};

for (let string of strings){

  let pattern_matches = [];

  for (let pattern of patterns){
    let regex = new RegExp(pattern.pattern, pattern.modifier);
    pattern_matches[pattern_matches.length] = regex.exec(string);
  }

  // if all the patterns matched
  if( pattern_matches.every( match => match ) ){
    // separate logic for the last match, because its value is not a hash
    last_match = pattern_matches.pop();

    some_node = big_hash;
    for(let match of pattern_matches){
      let key = match[1];
      some_node[ key ] = some_node[ key ] || {};
      some_node = some_node[ key ];
    }

    // for the last level matching, the default value is 0, not {}
    some_node[ last_match ] = some_node[ last_match ] || 0;
    some_node[ last_match ] = some_node[ last_match ] + 1;
  }
}