2016-03-23 3 views
4

Это мой массив объектов:Найти и удалить пустые свойства из объектов

var data = [ 
    { 
    "label": "HOME", 
    "href": "web-tutor99.com", 
    "children": [{}] 
    }, 
    { 
    "href": "web-tutor99.com", 
    "label": "HTML5" 
    } 
]; 

Это многомерный объект, и здесь свойство детей пусто. Как я могу найти пустые свойства, подобные этому, и удалить их с помощью jQuery?

+1

Какова цель, чего вы пытаетесь достичь, удалив элемент? Как я не вижу никакой практической причины, по которой вы будете тратить циклы, чтобы вычислить и удалить этот предмет. Если это потому, что это предмет отображения. Затем просто проверьте, сначала ли пуст, затем отобразите, если нет. – KyleK

+1

'' {{}] 'пустое значение для вас? –

ответ

1

Попробуйте

data = [{ 
 
     "label": "HOME", 
 
     "href": "web-tutor99.com", 
 
     "children": [{}] 
 
    }, { 
 
     "href": "web-tutor99.com", 
 
     "label": "HTML5" 
 
    }]; 
 

 
    alert("Before : "+JSON.stringify(data)); 
 
    //console.log(data); 
 

 
    checkEmptyObj(data); 
 

 
    alert("After : "+JSON.stringify(data)); 
 

 
    function checkEmptyObj(data) { 
 
     $.each(data, function(key, value) { 
 
     if ($.isPlainObject(value) || $.isArray(value)) { 
 
      checkEmptyObj(value); 
 
     } 
 
     //alert(key+":"+$.isEmptyObject(value)); 
 
     if (value === "" || value === null || $.isEmptyObject(value)) { 
 
      delete data[key]; 
 
     } 
 
     }); 
 

 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

спасибо, что это работает. – rayees

1

Вы можете сделать это ..

for (var i in data) { 
    if (test[i].children === null || test[i].children === undefined || test[i].children.length<=0) { 
    delete test[i].children; 
    } 
} 

Но я не вижу никакого практического смысла тратить процессорное время Перебор объектов для удаления пустых объектов.

Не уверен, чего вы пытаетесь достичь. Но вам лучше просто проверить, пуст ли он, а затем не отображать, если это так.

+3

Это не будет работать над его примером, так как свойство 'children' не является ни« null », ни« undefined », ни' length' 0 – Aides

+0

О, да, вы правы. Не видели эти дополнительные скобки. Виноват. – KyleK

0

Вы можете просто создать функцию (если вложенная, рекурсивная), прокручивая все элементы и проверить, имеет ли она значение, если нет, delete это свойство.

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

В качестве окончательного примечания вы можете использовать for...in для прокрутки свойств объекта и for...of для прокрутки значений объекта/массива.

0

Я думаю, что следующий чистый JS сниппет заботится о работе. Вы можете это проверить @JSBin

var data = [{"label":"HOME","href":"web-tutor99.com","children":[{}]},{"href":"web-tutor99.com","label":"HTML5"}]; 

function walkJSONObj(obj){ 
    for (var prop in obj) { 
    if (obj[prop].constructor === Array) {  //if prop is an array 
     walkJSONArray(obj[prop]);     //go walk through the arrays 
     obj[prop].length === 0 && delete obj[prop]; //if on return the array is empty delete it 
    } 
    else typeof obj[prop] === 'undefined' && delete obj[prop]; //delete undefined props 
    }  
} 

function walkJSONArray(arr){ 
    for (var l = arr.length-1; l >= 0; l--) { 
    walkJSONObj(arr[l]); // go walk the item objects 
    if (Object.keys(arr[l]).length === 0 && JSON.stringify(arr[l]) === JSON.stringify({})) { 
     arr.splice(l, 1); // if on return the object is empty delete it 
    } 
    } 
} 

walkJSONArray(data); 
Смежные вопросы