Разобрать строку
Добрый день. Помогите разобрать объект.
var object = [{name: 'Иванов А.Г. (тут)', obj: ''}, {name: 'Сидоров И.М.', obj: ''}, ];
Если после символов (например 'Иванов А.Г.') есть еще что то, перенести это что то из name в obj. А в name написать то что осталось Например:
// было
var object = [{name: 'Иванов А.Г. (тут)', obj: ''}, {name: 'Сидоров И.М.', obj: ''},... ];
//произвели манипуляцию
for (var i = 0; i < object .length; i++) {
if(object[i].name.match( /\.?\./gi )){
object[i].name =... // например Иванов А.Г.
object[i].obj = ... // например (тут)
};
}
//и на выходе получили такой объект
var object = [{name: 'Иванов А.Г.', obj: '(тут)'}, {name: 'Сидоров И.М.', obj: ''}, ];
Думал выловить две точки, что то типо [/\.?\./gi ] но что то недошло до меня как правильно :( |
Artur_Hopf,
попробуйте так:
var object = [{name: 'Иванов А.Г. (тут)', obj: ''}, {name: 'Сидоров И.М.', obj: ''}];
//произвели манипуляцию
for (var i = 0; i < object.length; i++) {
var fio = object[i].name.match(/.+\..\./gi);
if (fio) {
object[i].obj = object[i].name.replace(fio[0], '').trim();
object[i].name = fio[0];
}
}
console.log(object)
|
Artur_Hopf, лучше внесите изменения в скрипт, который генерирует исходные данные.
Иначе получается, что вы сначала создаете себе проблемы, потом их героически решаете. |
Artur_Hopf,
// было
var object = [{name: 'Иванов А.Г. (тут)', obj: ''}, {name: 'Сидоров И.М.', obj: ''} ];
var object = object.map(function(el) {
var arr = el.name.split(/\.\s+/);
return arr[1] && arr[1].trim() ? {name: arr[0]+".", obj: arr[1]} : el
})
console.log(object)
//и на выходе получили такой объект
//var object = [{name: 'Иванов А.Г.', obj: '(тут)'}, {name: 'Сидоров И.М.', obj: ''}, ];
|
Nexus,
Этот массив это xml фаил, его надо обработать. рони, Спасибо большое :victory: |
рони,
Подскажи пожалуйста, это регулярное выражение ищет именно символ после точки с пробелом /\.\s+/ А как сделать чтобы отсеивалось именно после двух точек? именно после символ. символ. Навроде (Екимов А.'может быть пробел' М.). |
var object = [{name: 'Иванов А.Г. (тут)', obj: ''}, {name: 'Сидоров И. М.', obj: ''} ];
object.forEach(function(o) {
var match = o.name.match(/^\s*([А-ЯЁ]\S+)\s+([А-ЯЁ])\s*\.\s*([А-ЯЁ])\s*\.\s*([\s\S]*?)\s*$/)
if(match){
if(match[4]){
o.obj = match[4];
}
o.name = match[1] + ' ' + match[2] + '.' + match[3] + '.';
}
});
alert(JSON.stringify(object, 0, 4))
Заодно приводит к одному виду.) |
Aetae,
А если так: [А-Я][а-я]+\s+[А-Я]\.\s+[А-Я]\.|[А-Я][а-я]+\s+[А-Я]\.[А-Я]\. сплитить? |
Artur_Hopf, суть в том, что фамилия может быть напимер Безденок-Кржижепольский или там О’Коннор, потому чтоб не ломать голову над всеми вариантами, сделал просто "непробел": \S. :)
|
Aetae,
Сейчас попробую, спасибо:) |
Цитата:
var a = [
{name: 'Иванов А.Г. (тут)', obj: ''},
{name: 'Петров Т. В. текст', obj: ''},
{name: 'Смирнова Ф. адрес', obj: ''},
{name: 'Сидоров И.М.', obj: ''},
];
var val;
for (var i=0; i<a.length; i++) {
a[i].name.replace(/^\S+\s+[А-Я]\.(\s?[А-Я]\.)?/,function(Str){
val=Str;
a[i].obj=a[i].name.replace(Str,'');
return Str;
});
a[i].name=val;
alert(a[i].name+' - '+a[i].obj);
};
|
Если "тут" не содержит точек, то можно удалить лишние мешающие пробелы, а затем найти две части:
var match = 'Иванов А. Г. (тут)'.replace(/\s{2,}/g, ' ').match(/(.+\.\s)([^\.]+)/);
//match[1], match[2] содержат искомое
|
Или такое...
var arr = [
{name: 'Иванов А.Г. (тут)', obj: ''},
{name: 'Петров Т. В. текст', obj: ''},
{name: 'Смирнова Ф. адрес', obj: ''},
{name: 'Сидоров И.М.', obj: ''},
];
for (var i=0; i<arr.length; i++) {
var a=arr[i].name.match(/^(\S+\s+[А-Я]\.(\s?[А-Я]\.)?)(.*)/);
arr[i].name=a[1];
arr[i].obj=a[a.length-1];
alert(arr[i].name+' - '+arr[i].obj)
};
|
Всем спасибо, написал так :thanks:
var array = arrayXML2[i].name.split(/^\s*([А-ЯЁ]\S+)\s+([А-ЯЁ])\s*\.\s*([А-ЯЁ])\s*\.\s*([\s\S]*?)\s*$/);
if(array[1]){
arrayXML[i].name = array[1] + ' ' + array[2] + '.' + array[3] + '.';
arrayXML[i].element = array[4];
}
|
| Часовой пояс GMT +3, время: 10:10. |