2015-10-08 3 views
-5

Учитывая следующий массив вложенных объектов:Как изменить массив объектов, содержащих значения с тем же именем?

var existingArray = [{ 
      "content": { 
       "host": { 
        "name": "Mia" 
       } 
      }, 
     }, { 
      "content": { 
       "host": { 
        "name": "Annie" 
       } 
      }, 
     }, { 
      "content": { 
       "host": { 
        "name": "Mia" 
       } 
      }, 
      , 
      { 
       content: { 
        host: { 
         name: "Oscar" 
        } 
       }, 
      }, 
      { 
       "content": { 
        "host": { 
         "name": "Annie" 
        } 
       }, 
      }, 
      { 
       "content": { 
        "host": { 
         "name": "Mia" 
        } 
       }, 
      }, 
      { 
       "content": { 
        "host": { 
         "name": "Annie" 
        } 
       }, 
      } 
     ]; 

Как бы я изменить значение имени объекта, если они совпадают - дифференцироваться их?

Чтобы создать новый массив, такие как:

 var existingArray = [{ 
      "content": { 
       "host": { 
        "name": "Mia" 
       } 
      }, 
     }, { 
      "content": { 
       "host": { 
        "name": "Annie" 
       } 
      }, 
     }, { 
      "content": { 
       "host": { 
        "name": "Mia_2" 
       } 
      }, 
      , 
      { 
       content: { 
        host: { 
         name: "Oscar" 
        } 
       }, 
      }, 
      { 
       "content": { 
        "host": { 
         "name": "Annie_2" 
        } 
       }, 
      }, 
      { 
       "content": { 
        "host": { 
         "name": "Mia_3" 
        } 
       }, 
      }, 
      { 
       "content": { 
        "host": { 
         "name": "Annie_3" 
        } 
       }, 
      } 
     ]; 

Мне нужно, чтобы сохранить структуру массива почти идентичны - с просто обновляет до дублированных значений имен.

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

+0

Вы пробовали что-нибудь? – Joseph

+0

Это довольно прямолинейно, вы что-то пробовали? – Bryan

+0

Честно говоря, я работал в течение нескольких дней и довольно устал - отсюда и ленивый, и публикую это. Хотел, чтобы кто-то быстро ответил. – webbydevy

ответ

1

Нечто подобное может работать для вас:

var i; 
var k; 
for(i = 0; i < existingArray.length; i++){ 
    var count = 2; 
    for(k = 0; k < existingArray.length; k ++){ 
     if(i != k && existingArray[i].content.host.name === existingArray[k].content.host.name){ 
      existingArray[k].content.host.name += '_' + count; 
      count++; 
     } 
    } 
} 
+0

Это близко - просто добавляет «_1» ко всем значениям, а не добавляет их в дубликаты: http://jsfiddle.net/ansible/uvx4zeeh/ – webbydevy

+1

изменить на 'if (i! = K && existingArray [i] .content.host.name === existingArray [k] .content.host.name) {'и start' count = 2; ' – FirstOne

+0

@FirstOne похоже, что там может быть синтаксическая ошибка. – webbydevy

0

Храните объект с каждым именем, используемым в качестве ключа, и количеством раз, которое оно использовалось в качестве значения.

Затем укажите на каждой итерации, чтобы узнать, было ли имя уже использовано.

Если он еще не был использован, добавьте его в массив и установите его в 1. В этом случае имя останется прежним.

Если он уже использовался, увеличьте его значение в массиве. В этом случае именем будет имя плюс '_' плюс значение, хранящееся в объекте, с использованием имени в качестве ключа.

var existingArray = [ 
 
    { 
 
     "content":{ 
 
     "host":{ 
 
      "name":"Mia" 
 
     } 
 
     } 
 
    }, 
 
    { 
 
     "content":{ 
 
     "host":{ 
 
      "name":"Annie" 
 
     } 
 
     } 
 
    }, 
 
    { 
 
     "content":{ 
 
     "host":{ 
 
      "name":"Mia" 
 
     } 
 
     } 
 
    }, 
 
    { 
 
     "content":{ 
 
     "host":{ 
 
      "name":"Oscar" 
 
     } 
 
     } 
 
    }, 
 
    { 
 
     "content":{ 
 
     "host":{ 
 
      "name":"Annie" 
 
     } 
 
     } 
 
    }, 
 
    { 
 
     "content":{ 
 
     "host":{ 
 
      "name":"Mia" 
 
     } 
 
     } 
 
    }, 
 
    { 
 
     "content":{ 
 
     "host":{ 
 
      "name":"Annie" 
 
     } 
 
     } 
 
    } 
 
] 
 
, usedNames = {} 
 
, newArray = [] 
 
, result = '' 
 
; 
 
for(var index = 0; index < existingArray.length; index ++) { 
 
    var name = existingArray[index]['content']['host']['name']; 
 
    newArray.push(existingArray[index]); 
 
    if(typeof usedNames[name] !== 'number') { 
 
     usedNames[name] = 1; 
 
     newArray[index]['content']['host']['name'] = name; 
 
    } else { 
 
     usedNames[name] ++; 
 
     newArray[index]['content']['host']['name'] = name + '_' + usedNames[name]; 
 
    } 
 
    result += 'content: host: name: ' + newArray[index]['content']['host']['name'] + '<br/>'; 
 
} 
 
document.write(result);

+0

Прокомментировал ли мой комментарий к вопросу? – FirstOne

+0

@FirstOne Nope. Я видел это после. –

Смежные вопросы