Функция Javascript Object push ()

102

У меня есть объект javascript (на самом деле я получаю данные через запрос ajax):

var data = {};

Я добавил в него кое-что:

data[0] = { "ID": "1"; "Status": "Valid" }
data[1] = { "ID": "2"; "Status": "Invalid" }

Теперь я хочу удалить все объекты с недопустимым статусом (но сохранить порядок в том же порядке):

var tempData = {};
for ( var index in data ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;

На мой взгляд, все это должно работать, но я получаю сообщение об ошибке, tempData.pushкоторое не является функцией. Я понимаю, почему это не то же самое, что массив, но что я мог сделать иначе?

Эндрю Джекман
источник
4
Похоже, вам просто нужно использовать массив
Есаилия

Ответы:

132

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

var data = [];
// ...
data[0] = { "ID": "1", "Status": "Valid" };
data[1] = { "ID": "2", "Status": "Invalid" };
// ...
var tempData = [];
for ( var index=0; index<data.length; index++ ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;
Мэтт Болл
источник
9
+1 опередил меня. Не забудьте также поменять for...inпетлю.
Andy E
@MattBall мой плохой! Я не очень разбираюсь в ТАК обзоре и прочем! :)
Shouvik
1
Push предназначен для массива. Есть ли способ добавить массив к объекту?
Venkat
1
А как насчет ассоциативного массива?
Kinnard Hockenhull
@KinnardHockenhull Извините, я не понимаю вопроса. Вы можете пояснить, о чем спрашиваете?
Мэтт Болл,
18

Объекты не поддерживают свойство push, но вы также можете сохранить его, используя индекс в качестве ключа,

var tempData = {};
for ( var index in data ) {
  if ( data[index].Status == "Valid" ) { 
    tempData[index] = data; 
  } 
 }
data = tempData;

Я думаю, что это проще, если удалить объект, если его статус недействителен, выполнив.

for(var index in data){
  if(data[index].Status == "Invalid"){ 
    delete data[index]; 
  } 
}

И, наконец, вам не нужно создавать var temp -

чсантана
источник
Добавьте объяснение с ответом на то, как этот ответ помогает OP в
решении
5

Вы должны сделать var tempData = new Array();

Push - это функция массива.

Алекс Дн
источник
9
Почему new Array()и нет []?
Мэтт Болл
3
[] - альтернатива (ярлык) для создания нового массива. Это можно сделать с помощью [] и с помощью new Array ().
Alex Dn
6
[]- это основной способ создания массивов, другой - альтернативный, и его можно даже перезаписать.
Esailija
6
См. Stackoverflow.com/questions/885156/… для обсуждения того, почему new Array()зло
Йонас Хёг,
w3schools.com/js/js_obj_array.asp new Array - это обычный массив. Где [] определяется как первичный?
Alex Dn
3

Язык программирования Javascript поддерживает парадигму функционального программирования, поэтому вы можете легко работать с этими кодами.

var data = [
    {"Id": "1", "Status": "Valid"},
    {"Id": "2", "Status": "Invalid"}
];
var isValid = function(data){
    return data.Status === "Valid";
};
var valids = data.filter(isValid);
регулярное выражение
источник
2

Я предполагаю, что ДЕЙСТВИТЕЛЬНО вы получаете объект с сервера и хотите получить объект на выходе

Object.keys(data).map(k=> data[k].Status=='Invalid' && delete data[k])

Камил Келчевски
источник
0
    tempData.push( data[index] );

Я согласен с правильным ответом выше, но .... вы все еще не указываете значение индекса для данных, которые вы хотите добавить в tempData. Без значения [index] будет добавлен весь массив.

user3094826
источник
Пожалуйста, подробно опишите, как решить проблему. Спасибо.
Леонид Гланц
Это могло бы исправить принятый ответ Мэтта Болла. Поскольку мы просматриваем данные в цикле, мы должны передавать только данные [индекс], а не данные целиком.
Джонатан Бержерон,
-2

Делать :


var data = new Array();
var tempData = new Array();

Судхир Бастакоти
источник
5
Почему new Array()и нет []?
Мэтт Болл
обратите внимание на разницу между new Array (); и новый массив; Вы должны уметь отвечать на такие вопросы вместо того, чтобы рассказывать об альтернативах ..
Джонатан