Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.06.2018, 14:55
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 252

Соединение массива
Добрый день есть 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 массива где совпадают поля. Без вот того что я сверху написал, учитывая что длинна массива не совпадает. Вроде как чтоб была таблица у кого нет номеров телефонов поля пустые у кого есть заполнены в соответсвии с совпадающими именами.
Ответить с цитированием
  #2 (permalink)  
Старый 07.06.2018, 15:34
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 626

Сообщение от 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;
     }
  }
}


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

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

если только один отсортирован, то поиск делением пополам.
Ответить с цитированием
  #3 (permalink)  
Старый 07.06.2018, 16:01
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 252

Alexandroppolus,
Попробовал, в a3 просто переносится значение из a1 и все =(
Ответить с цитированием
  #4 (permalink)  
Старый 07.06.2018, 16:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 25,843

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)
Ответить с цитированием
  #5 (permalink)  
Старый 07.06.2018, 16:48
Профессор
Отправить личное сообщение для Artur_Hopf Посмотреть профиль Найти все сообщения от Artur_Hopf
 
Регистрация: 13.03.2018
Сообщений: 252

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход многомерного массива с задержкой после каждого цикла Walk Общие вопросы Javascript 2 14.08.2017 16:17
Помогите к js коду, написать html код Modrih Элементы интерфейса 8 16.06.2015 18:08
Ввод диапазона значений массива с клавиатуры Воскобоенко Общие вопросы Javascript 11 06.06.2015 22:34
Сортировка массива по возрастанию другого массива. vas88811 Events/DOM/Window 4 12.01.2014 08:31
Перебор массива - вложенный цикл SWin Общие вопросы Javascript 35 27.12.2013 03:06