2015-12-02 3 views
0

Как я могу упростить это массиворганизации/группы массив на основе состояния - Javascript

[ china, country1(city1), country1(city2), country1(city3)), korea, australia] к

[ china, country1(city1, city2, city3), korea, australia] 
+0

Изменить 'country1' принять несколько аргументов? Конечно, это также изменит количество элементов в массиве. –

+0

Количество элементов в стране1 может отличаться. Как я могу изменить страну1 для принятия аргументов? Я думал, что это всего лишь элемент массива. – Mustang

+0

'country1' представляется функцией. Разве это не так? Ваш вопрос не совсем понятен. Пожалуйста, внимательно прочитайте [ask] и [edit] свой вопрос. –

ответ

0

перебирать элементы массива

  1. Extract страну и город отдельно
  2. Обновить карту страны-города (ваш объект, который отслеживает страны, сопоставленные с городами)
  3. Пройдите через ключи этого объекта и создайте новый массив со своим городом. Если в этой стране есть массив городов, используйте join(','), чтобы получить разделенную запятыми строку ваших городов.

var cityRegex = /\((.*)\)/; 
 
var countryRegex = /([^()]*)\(?.*\)?/; 
 

 
var countryCityArray = ['china', 'country1(city1)', 'country1(city2)', 'country1(city3)', 'korea', 'australia']; 
 

 
var countryCityMap = {}; 
 

 
countryCityArray.forEach(function(countryCity) { 
 
    var matches = countryRegex.exec(countryCity); 
 
    var country = matches[1] 
 
    if (!countryCityMap[country]) { 
 
    countryCityMap[country] = []; 
 
    } 
 

 
    matches = cityRegex.exec(countryCity); 
 

 
    if (matches && matches.length) { 
 
    var city = matches[1]; 
 
    countryCityMap[country].push(city); 
 
    } 
 

 
}); 
 

 
var targetArray = Object.keys(countryCityMap).map(function(country) { 
 
    var countryCity = country; 
 
    if (countryCityMap[country].length) { 
 
    countryCity = countryCity + '(' + countryCityMap[country].join(',') + ')'; 
 
    } 
 
    return countryCity; 
 
}); 
 

 
console.log(targetArray);

+0

Я попробовал. Решение не работает, если элемент массива имеет другой специальный символ: var array = ['abc', 'xyz (test2)', 'x & z (test3)', 'x & z (test4)', 'pqr', 'kl -m ']; – Mustang

+0

@SAM, регулярное выражение должно быть изменено. См. Мой обновленный ответ – AmmarCSE