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


101

У мене є об'єкт 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
Схоже, вам слід просто використовувати масив
Esailija

Відповіді:


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 мій поганий! Я насправді не настільки досвідчений у огляді та ін. :)
Шувік

1
Push призначений для масиву. Чи є спосіб додати масив до об’єкта?
Венкат

1
А як щодо асоціативного масиву?
Кіннард Хоккенхалл

@KinnardHockenhull Вибачте, я не розумію питання. Ви можете пояснити, про що запитуєте?
Matt Ball

17

Objects не підтримує властивість 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 -


Додайте пояснення з відповіддю на те, як ця відповідь допомагає ОП у вирішенні поточної проблеми
ρяσѕρєя K

5

Ви повинні зробити var tempData = new Array();

Push - це функція Array.


9
Чому new Array()і ні []?
Matt Ball

3
[] - це альтернатива (ярлик) для створення нового масиву. Це можна зробити за допомогою [] та за допомогою нового Array ().
Alex Dn

6
[]є основним способом створення масивів, інші є альтернативними і навіть можуть бути перезаписані.
Esailija

6
Див. Stackoverflow.com/questions/885156/… для обговорення того, чому new Array()зло
Йонас Хьог

w3schools.com/js/js_obj_array.asp новий масив - це звичайний масив. Де [] визначається як основний?
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] буде додано весь масив.


Будь ласка, детально опишіть, як вирішити проблему. Дякую.
Леонід Гланц,

Це було б виправити прийняту відповідь від Метта Болла. Оскільки ми переглядаємо дані, нам слід лише проштовхувати дані [індекс], а не дані цілком.
Джонатан Бержерон,

-2

Зробіть:


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


4
Чому new Array()і ні []?
Matt Ball

зверніть увагу на різницю між new Array (); та новий масив; Ви повинні мати можливість відповідати на такі запитання, а не розповідати про альтернативи.
Джонатан,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.