2016-05-27 2 views
1

У меня есть этот массив объектов, которые я показываю на таблице пользовательского интерфейса. Он имеет 3 столбца с именем, контактом и идентификатором.Добавить значение в массив объектов

[Object, Object, Object] 
0:Object 
    name: "Rick" 
    Contact: "Yes" 
    id: 1 
1:Object 
    name:"Anjie" 
    Contact:"No" 
    id: 2 
2:Object 
    name:"dillan" 
    Contact:"Maybe" 
    id:3 

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

[Object, Object, Object,Object] 
0:Object //newly added row. Since new row is added, it doesnt have any data. 
name: "" 
Contact: "" 
id: 
1:Object 
name: "Rick" 
Contact: "Yes" 
id: 1 
2:Object 
name:"Anjie" 
Contact:"No" 
id: 2 
3:Object 
name:"dillan" 
Contact:"Maybe" 
id:3 

Я хочу, чтобы массив объектов выглядел следующим образом, а не над одним.

[Object, Object, Object,Object] 
0:Object //newly added row. Since new row is added, it doesnt have any data. 
name: "" 
Contact: "" 
id: 4   
1:Object 
name: "Rick" 
Contact: "Yes" 
id: 1 
2:Object 
name:"Anjie" 
Contact:"No" 
id: 2 
3:Object 
name:"dillan" 
Contact:"Maybe" 
id:3 

Единственное изменение - значение id на 0-ом объекте. Вы можете видеть, что я ввел его как 4. Он проверит максимальное значение в массиве объектов для id. В этом случае оно равно 3. Таким образом, он увеличится на 1 и поместит его как значение id для вновь добавленной строки.

Может кто-нибудь дать мне знать, как этого достичь.

Кроме того, у меня был еще один запрос.

Если мои значения id следующие.

1 
2 
3 
4 
5 
6 

И я удалить 4 и 5. Таким образом, новые строки будут

1 
2 
5 
6 

Здесь будет проверять максимальную длину в 4 и добавить значение идентификатора 5 к вновь ряду. это будет выглядеть примерно так.

5 
1 
2 
5 
6 

В этом случае повторяется 5. Я не хочу этого. Вместо этого я хотел бы видеть, какое значение является наивысшим значением для id, а затем увеличивать id в соответствии с ним. Так должно выглядеть так.

7 
1 
2 
5 
6 

ответ

-1

Если вы заботитесь только о ID является уникальным, вы можете добавить метку в качестве идентификатора

Давайте предположим, что ваш массив называется peopleContact ваш код для добавления элемента в массив объектов будет выглядеть примерно так:

var person= new Object(); 
person.name= ""; 
person.Contact= ""; 
person.id = Date.now(); 

peopleContact.push(person); 
+0

ничего себе. никогда не думал об этом. это было бы лучше всего для моего дела. – Patrick

+0

Если вы считаете, что это ваш ответ, то отметьте его как принятый. Если у вас есть другой вопрос, пожалуйста, спросите. – pparas

+2

@Patrick: Вы уверены, что можете гарантировать, что в течение того же миллисекунды вы никогда не нажмете больше одного объекта в массив? –

3

Вы можете использовать это, чтобы найти следующий максимально возможную ID (при условии, что это не тривиально всегда равна длине массива):

var newID = 1 + myArray.reduce(function(p, c) { 
    return Math.max(c.id, p); 
}, 0); 

где myArray это ваш массив.

В ES6 вы можете использовать:

var newID = 1 + myArray.reduce((p, c) => Math.max(c.id, p), 0) 
+1

Если вы все равно итерации, почему бы не '.reduce()'? Кажется, немного расточительное использование функции, чтобы сделать массив значений для перехода к 'Math.max' вместо того, чтобы просто определять максимальное значение справа в функции. –

+1

@squint Я показал это, хотя это, возможно, сложнее понять. Он также показывает, что существует проблема с версией «Math.max», если она передана пустым массивом. Хмм ... – Alnitak

+0

@ squint- я отредактировал мой вопрос, поскольку возникла проблема, если я просто взял максимальную длину. Можете ли вы помочь мне, как решить эту проблему. – Patrick

4

Если я вас правильно понимаю, вы просто хотите запустить:

array[0].id = array.length; 

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

{ 
    name:"", 
    Contact:"", 
    id: array.length + 1 
} 

EDIT:

В ответ на ваши изменения, показывая, что ряды массив можно удалить.

В этом случае, чтобы получить значение ID, у вас есть несколько вариантов.

Каждый должен пройти через все элементы массива во время удаления и уменьшить идентификатор всех строк, у которых есть идентификатор, отличный от удаленной строки. Это, вероятно, лучшее решение.

Пример кода:

var delete = function(array, idToDelete) { 
    for(var i = 0; i < array.length; i += 1) { 
    if(array[i].id === idToDelete) { 
     array.splice(i, 1); 
    } else if (array[i].id > idToDelete) { 
     array[i].id = array[i].id - 1; 
    } 
    } 
} 

Если по какой-либо причине, это не вариант, я бы рекомендую переборе массива, чтобы найти самый высокий ID в нем, и добавление 1.

var newId = array[0].id; 
for(var i = 0; i < array.length; i += 1) { 
    if(array[i].id > newId) { 
    newId = array[i].id; 
    } 
} 
array.splice(0, 0, {name:"", Contact:"", id: newId + 1}); 
+1

'array.length - 1' во втором подходе? ;) – talemyn

+1

Не смотри на вопрос П.П. Его идентификаторы 1-индексируются по любой причине. Кроме того, во втором подходе нет, это +1. Думаю об этом; при добавлении первого элемента длина массива будет равна 0, но желаемый идентификатор будет равен 1. –

+0

О, ладно. , , Я неправильно понял ваше описание. , , мой плохой (т. е. я подумал «когда он добавлен» = «он уже добавлен»). А потом я испортил математику. , , знаешь что . , , просто игнорируйте его. : D – talemyn

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