2016-04-09 2 views
1

Я искал и искал и не могу найти ответ на этот вопрос, поэтому, пожалуйста, примите мои извинения, если я буду глуп.Как полностью удалить пустой массив в javascript?

Я создаю приложение в node.js, которое использует файлы JSON в качестве конфигураций проекта. Я использую модуль «fs» для чтения файла JSON, который затем анализирую на объект Javascript. Затем я изменяю детали объекта перед использованием JSON.stringify, чтобы записать данные обратно в файл.

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

"floors": [ 
    { 
     "floorName": "Grd Floor", 
     "floorNotes": "", 
     "floorPlan": "Buckley_Grd.jpg", 
     "floorWidth": "57.392", 
     "floorHeight": "20.776", 
     "runs": [ 
      [], *<----I cannot delete these* 
      [] *<----only empty them* 
      [ 
       { 
        "xCoOrd": "37.88235294117647", 
        "yCoOrd": "59.307359307359306", 
        "drawingType": "node" 
       }, 
       { 
        "xCoOrd": "37.88235294117647", 
        "yCoOrd": "59.307359307359306", 
        "drawingType": "node" 
       }, 
       { 
        "xCoOrd": "48.549019607843135", 
        "yCoOrd": "50", 
        "drawingType": "node" 
       } 
      ] *<----I don't want to delete the elements in this array* 
     ] 
    } 

Я попытался:

.splice(0); 
.filter(Boolean); 
delete 

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

Большое спасибо за предоставленные консультации.

EDIT: Мне следовало бы уточнить, что я не обязательно хочу удалять все элементы в массиве, поэтому redeclaring floors.runs = [], к сожалению, мне не поможет.

Я пробовал:

delete floors[floorID].runs[runID]; 

Это заменяет массив с нулем, который получает записываются в файл и губит мое чтение JSON.

+1

Как вы попробовали 'delete'? – usr2564301

+0

Вы пытались установить «пробежки» на «null»? – Seblor

+1

Определите «удалить массив». Уточните, что именно вы пытались, и почему это не сработало для вас. – Oriol

ответ

1

Если вы хотите удалить все значения из runs массива вы просто сделать это:

floors[i].runs = null 

Если вы хотите удалить только пустышки

var filled = []; 
obj.floors[i].runs.forEach(function(value, i, array) { 
    if (value.length != 0) filled.push(value); 
}); 

obj.floors[i].runs = filled; 
+0

Большое спасибо; Я вижу, что это хороший способ добиться правильного результата.Ответ Джейсона ниже казался хорошим для меня, но у меня были проблемы с ним, перед которым я теперь не могу воспроизвести по какой-то причине, однако это определенно работает !! – simecircle

+0

Рад помочь вам. Не забывайте отмечать как ответ. – Max

3

Вы пытались переписать свойство «работает» для каждого объекта? Если вы сказали floors[0].runs = [] (или floors[i].runs = [], если вы зацикливаетесь), то эти две пустые массивы больше не появятся в вашей строке.

Редактирование мой ответ, чтобы соответствовать OP правок:

floors.forEach(function(floor){ 
    var newRuns = []; 
    floor.runs.forEach(function(run){ 
     if (run.length > 0){ 
      newRuns.push(run); 
     } 
    }) 
    floor.runs = newRuns; 
}) 

После того как я присвоить объект из OP в переменную и запустить свой код на нем, то stringify результат, я получаю это как a Возврат:

{"floors":[{"floorName":"Grd Floor","floorNotes":"","floorPlan":"Buckley_Grd.jpg","floorWidth":"57.392","floorHeight":"20.776","runs":[[{"xCoOrd":"37.88235294117647","yCoOrd":"59.307359307359306","drawingType":"node"},{"xCoOrd":"37.88235294117647","yCoOrd":"59.307359307359306","drawingType":"node"},{"xCoOrd":"48.549019607843135","yCoOrd":"50","drawingType":"node"}]]}]} 

Это то, что вы надеетесь увидеть? Я использовал этот fiddle для получения этого результата.

+0

Большое спасибо за ваш комментарий. Из других комментариев кажется, что я не был достаточно ясен, поэтому я их отредактирую. Я хочу удалить отдельные элементы в массиве, но, возможно, вам придется оставить других так, чтобы переделать массив таким образом, чтобы удалить их, не так ли? – simecircle

+0

Да, мой оригинальный код уничтожит все ссылки на все, что было сохранено в забегах. Я обновил свой код, чтобы соответствовать редактированию, которое вы сделали для OP. Дайте мне знать, если это не то, что вы ищете, я буду рад помочь вам в дальнейшем. – Ovid2020

+0

Это похоже на ответ «Макс» ниже, и большинство оценили также! У меня есть разные части моего кода, чтобы добавлять и удалять целые отдельные элементы из прогона, а также целые прогоны и продолжать сталкиваться с этой проблемой, в результате чего возникает нулевое значение. Поскольку я использую JSON, чтобы затем построить линию на фоне , это наполняет все. Ваш код и Макс внизу снижают эти значения. Большое спасибо!! (Не уверен, какой из них отмечать как ответ, хотя, возможно, Макс, когда он отвечал первым) – simecircle

0

Runs - это свойство объекта, вы можете удалить элементы из этого массива. В вашем примере над этажами [0] .runs.splice (0,2) следует удалить обе эти массивы, которые я думаю.

+0

Большое спасибо. Я пробовал это, и это кажется лучшим решением, но, действительно, у меня есть такая прерывистая проблема, при которой он, кажется, заменяет массив нулевым значением при работе на моей локальной машине (Mac), но когда я запускаю на своем Linux-сервере, он отлично работает ! Я знаю, как это сумасшедшее это звучит так, если я попытаюсь поддержать ваш ответ, но не могу, поскольку я так новичок !! Еще раз спасибо! – simecircle

0

Сохраняя ту же ссылку

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

var i, parentArray = obj['floors'][0]['runs']; 
for (i = parentArray.length; i >= 0; --i) { 
    if (parentArray[i].length === 0) parentArray.splice(i, 1); 
} 

Создание новой эталонной

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

obj['floors'][0]['runs'] = obj['floors'][0]['runs'].filter(function (x) { 
    return x.length > 0; 
}); 
0

Чтобы полностью удалить объект, вы должны удалите ссылку из родителя. Для этого вы можете создать новый Array, в котором вы копируете только ссылки на непустые массивы.

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

function clearEmptyArrays(obj) { 
    for(var key in obj) { 

    var arr = obj[key]; 

    if(Array.isArray(arr)) { 
     // Iterate through all elements and remove empty arrays 
     var nonEmptyArr = []; 
     for(var i = 0; i < arr.length; ++i) { 
     // Recursive call if it's an object inside an array 
     if(typeof arr[i] === 'object') clearEmptyArrays(arr); 

     // Save all non-empty arrays or objects inside this one 
     if((Array.isArray(arr[i]) && arr[i].length > 0) || !Array.isArray(arr[i])) {   
      nonEmptyArr.push(arr[i]); 
     } 
     } 

     obj[key] = nonEmptyArr; 
     return; 
    } 

    // Recursive call if it's an object 
    if(typeof arr === 'object') { 
     clearEmptyArrays(arr); 
    } 
    } 
} 

Вы можете назвать это так: clearEmptyArrays(myObj); и обновит объект на месте.

Демонстрация: https://jsfiddle.net/zeo7dauh/

+0

Большое спасибо. Я вижу, что это работает на вашем jsfiddle, но по какой-то причине в моем коде это не так. – simecircle

+0

Почему это не работает? Вы получаете какие-либо ошибки? Возможно, что-то не так с рекурсивностью. – Cristy

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