Вывести несколько ячеек из внутреннего цикла - PullRequest
0 голосов
/ 02 мая 2018

это мой код:

    start() {
  let columns = ['A'...'Z'];

  let fields = {
      id: [
        'Medlemsnummer',      
      ],
      name: [
        'Namn',
      ],
  };
  let out = {};
  let self = this;
  columns.forEach(function(column) {
    for(let row = 1; row < 101; row++) {
      let cell = column + row;
      let d_cell = self.worksheet[cell];
      let val_cell = (d_cell ? d_cell.v : ' ');
      let cell_string = val_cell.toString().toLowerCase();
      let cellString_stripped = cell_string.replace(/(?:\r\n|\r|\n)/g, '');
      for (var key in fields) {
          // skip loop if the property is from prototype
          if (!fields.hasOwnProperty(key)) continue;
          var obj = fields[key];
          for (var prop in obj) {
              // skip loop if the property is from prototype
              if(!obj.hasOwnProperty(prop)) continue;
              obj.forEach(function(term) {
                if(cellString_stripped.match(new RegExp(term.toLowerCase() + ".*"))){
                  //out.push(obj + ': ' + cell);
                  //out[obj] = {cell};
                  out[obj] = cell;
                }
              });
              //out[obj]
          }
      }
    }
  });
  console.log(out);
},

и моя проблема в том, что я хочу, чтобы несколько совпадающих ячеек были в out [obj] = // массиве совпадающих ячеек.

как я могу сделать это в JavaScript?

так что мой выход должен выглядеть так:

out = [ medlemsnummer: ['A11','A23','A45'], name: ['B11','B23'] etc... ]

пожалуйста, прокомментируйте, если вам нужно, чтобы я объяснил лучше.

С уважением,

Йоаким

1 Ответ

0 голосов
/ 02 мая 2018

Глядя на ваши петли, я думаю, что вы немного потерялись в своих собственных структурах. out[obj] = cell определенно не кажется правильным; obj - это объект, его нельзя использовать в качестве ключа в другом объекте. Вот мой пример с некоторыми заметками, надеюсь, я правильно истолковал ваш код и ваш вопрос. Я начинаю с цикла после инициализации всех ваших переменных, таких как cell, d_cell и т. Д.):

for (let key in fields) {
    if (!fields.hasOwnProperty(key)) continue;

    let terms = fields[key];
    // fields[key] yields us an array, e.g.:
    // fields['id'] = [ 'Medlemnummer' ]
    // so we can iterate over it directly with for..of.

    // Note also: variable names like "obj" make reading your code
    // difficult; use meaningful names, e.g. "terms".
    for (let term of terms) {
        let regex = new RegExp(term.toLowerCase() + ".*");

        // Note: RegEx.test() is more efficient than String.match()
        // if all you need is a yes/no answer.
        if (!regex.test(cellString_stripped)) continue;

        // Here's the part you actually needed help with:
        if (!out[term]) {
            out[term] = [];
        }
        out[term].push(cell);
     }
 }

Приложение: В коде, который я придерживаюсь вашего решения, использовать RegExp для проверки строк. Однако, если вам нужно только проверить, начинается ли строка с данной подстроки, то использовать ее гораздо короче и эффективнее String.startsWith():

for (let term of terms) {
    if (!cellString_stripped.startsWith(term.toLowerCase())) continue;

    // Here's the part you actually needed help with:
    if (!out[term]) {
        out[term] = [];
    }
    out[term].push(cell);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...