Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   split и IE8, показывает пустой массив (https://javascript.ru/forum/misc/74181-split-i-ie8-pokazyvaet-pustojj-massiv.html)

Artur_Hopf 20.06.2018 08:19

split и IE8, показывает пустой массив
 
Добрый день, столкнулся с проблемой что не могу обработать объект с помощью регулярного выражения в internet explorer 8. В более старших версиях и других браузерах все работает.

Вот код:

var array = [{name: 'Петров В. Б.'}];

var split = array[0].name.split(/^\s*([А-ЯЁ]\S+)\s+([А-ЯЁ])\s*\.\s*([А-ЯЁ])\s*\.\s*([\s\S]*?)\s*$/);
alert(split);


В IE 8 выдает просто что массив split пуст. Кто нибудь сталкивался?:-?

Rise 20.06.2018 08:41

А так alert(split.length)?

рони 20.06.2018 09:00

Artur_Hopf,
а если так?
var array = [{name: 'Петров В. Б.'}];
var split = array[0].name.match(/[А-ЯЁ]+/gi);
alert(split);

Rise 20.06.2018 09:07

Artur_Hopf,
странная у вас регулярка даже такое пропускает 'П5$%^&q В. Б.'

Alexandroppolus 20.06.2018 09:59

Словеса, начертаные в папирусах MDN

"Если разделитель является регулярным выражением, содержащим подгруппы, то каждый раз при сопоставлении с разделителем, результаты (включая те, что не определены) захвата подгруппы будут помещаться внутрь выходного массива. Однако, не все браузеры поддерживают эту возможность."

Artur_Hopf 20.06.2018 10:04

рони,
Да с помощью .match заработало но он изменяет получившийся объект от того каким он был при .split

Пример:
// было
var array = [{name: 'Петров В. Б.'}, {name: 'Не человек'}];

for (var i = 0; i < array.length; i++) {	
var split = array[i].name.split(/^\s*([А-ЯЁ]\S+)\s+([А-ЯЁ])\s*\.\s*([А-ЯЁ])\s*\.\s*([\s\S]*?)\s*$/);
alert(split);
};


Тоесть в данном примере если фамилия, то split[0] = '', split[1] = Петров и тп. А если не фамилия split[0] = 'Не человек'. в этом и был смысл.

Если использовать .math split[0] всегда занят и не работает если не "человек":

var array = [{name: 'Петров В. Б.'}, {name: 'Не человек'}];

for (var i = 0; i < array.length; i++) {	
var split = array[i].name.match(/^\s*([А-ЯЁ]\S+)\s+([А-ЯЁ])\s*\.\s*([А-ЯЁ])\s*\.\s*([\s\S]*?)\s*$/);
alert(split);
};

Artur_Hopf 20.06.2018 10:17

Ребят, заработало, но объясните мне почему. В интернете нашел такую обработку, после нее .split заработала корректно. Но я искал замену .filter. Пока не вижу взаимосвязи.
if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
      {
        var val = t[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, t))
          res.push(val);
      }
    }

    return res;
  };
};


Часовой пояс GMT +3, время: 05:48.