Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Соединение массива (https://javascript.ru/forum/misc/74040-soedinenie-massiva.html)

Artur_Hopf 07.06.2018 14:55

Соединение массива
 
Добрый день есть 2 массива с разной длинной массива
Допустим в одном массиве length == 600, в другом length == 50.
массивы примерно выглядят так:

var array = [{name: 'Мешков Андрей Паразитович', data: 'Вредитель'}];
var array2 = [{name: 'Мешков А.П.', teleph: '12345'}];


Нужно создать 3 массив в котором бы совпадали поля name, делаю так:
var array = [{name: 'Мешков Андрей Паразитович', data: 'Вредитель'}];
var array2 = [{name: 'Мешков А.П.', teleph: '12345'}];
var array3 = [];
var array4 = [];
for(i = 0; i < array .length; i++){
	            array3.push(array [i].name.toString().split(' '));
};
// простите за гавнокод
for(i = 0; i < array3.length; i++){
	 if(array3[i].length >= 3){
	       array4.push(array3[i][0]+' ' + array3[i][1][0]+'.'+ array3[i][2][0]+'.');
	 };
};

// в array4 получаем Мешков А.П.
//создаем героический array5 (не бейте меня)
var array5 = []
for(i = 0; i < array .length; i++){
         array5.push(name:array[i] , name2:array4[i], data:data[i]);
}

Теперь как в array5 еще и засунуть teleph из array2 чтоб у него параметр name совпадал c параметром name2 из array5.

А вообще как правильно соеденить 2 массива где совпадают поля. Без вот того что я сверху написал, учитывая что длинна массива не совпадает. Вроде как чтоб была таблица у кого нет номеров телефонов поля пустые у кого есть заполнены в соответсвии с совпадающими именами.

Alexandroppolus 07.06.2018 15:34

Цитата:

Сообщение от Artur_Hopf
А вообще как правильно соеденить 2 массива где совпадают поля.

если массивы небольшие, то вложенный цикл и сложность O(N*M), примерно так:
var a1 = [...], a2 = [...];
var a3 = [];
for (var i = 0; i < a1.length; ++i) {
  var item = { a[i] ... }; // копируем данные из a1
  a3.push(item); // забираем данные из a1
  for (var j = 0; j < a2.length; ++j) {
     if (item.xxx === a2[j].xxx) {
       item.nnn = a2[j].nnn;
       break;
     }
  }
}


если большие (десятки тыщ в каждом), то по одному из них создают объект-индекс, потом данные получают по индексу.

если совсем повезло и оба массива отсортированы по общему полю, можно параллельно обойти оба, линейное время на всё про всё.

если только один отсортирован, то поиск делением пополам.

Artur_Hopf 07.06.2018 16:01

Alexandroppolus,
Попробовал, в a3 просто переносится значение из a1 и все =(

рони 07.06.2018 16:14

Artur_Hopf,
var array = [{name: 'Мешков Андрей Паразитович', data: 'Вредитель'}];
var array2 = [{name: 'Мешков А.П.', teleph: '12345'}];
var array3 = [];

for (var i = 0; i < array.length; i++) {
    var str = array[i].name,
        name2 = str.replace(/(\s+\S)(\S+)/gi, "$1.").replace(/\.\s+/, "."),
        el = array2.find(function(element) {
            return element.name.trim() == name2.trim()
        });
    if (el) {
        el = Object.assign({name2: el.name}, el, array[i]);
        array3.push(el)
    }
};

console.log(array3)

Artur_Hopf 07.06.2018 16:48

рони,
Спасибо, я тебе как нибудь денег наверное даже вышлю:p
Но пока их нет, низкий тебе поклон =)


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