Удалите объект определенного индекса в массиве JSON, не оставляя "null" позади (Node.js)

У меня есть локальный файл JSON по пути static/json/test.json. Его содержимое - [{"id": 12}, {"id": 44}]. Я хочу прочитать его, удалить из него объект индекса i и переписать файл, чтобы, например, i = 0, новое содержимое было [{"id": 44}].

Что я пробовал до сих пор:

let i = 0;

fs.readFile("static/json/test.json", "utf8", function(err, data) {
    let obj = JSON.parse(data); // obj is now [{"id": 12}, {"id": 44}]
    delete obj[i];
    fs.writeFile("static/json/test.json", JSON.stringify(obj), "utf8");
    // test.json should now be [{"id": 44}], but its [null, {"id": 44}]
});

Если я это сделаю, содержимое test.json будет не [{"id": 44}], а [null, {"id": 44}].

Я читал об использовании obj.splice(i, 1); вместо delete obj[i];, но по какой-то причине он ничего не делает, и я не получаю никаких ошибок.

Как удалить объект индекса i из этого массива JSON, не оставляя null?

Редактировать:

Спасибо за быстрые ответы! Обычно obj.splice(i, 1); должен работать, причина, по которой он не работает для меня, связана с моей настройкой. Рабочий ответ для меня

let i = 0;

fs.readFile("static/json/test.json", "utf8", function(err, data) {
    let obj = JSON.parse(data); // obj is now [{"id": 12}, {"id": 44}]

    delete obj[i];
    obj = obj.filter(item => item);

    fs.writeFile("static/json/test.json", JSON.stringify(obj), "utf8");
    // test.json is now [{"id": 44}]
});

Использование кода, который вы здесь показываете с obj.splice(i, 1) вместо delete obj[i], отлично работает и приводит к test.json как [{"id":44}]. В вашей настройке должна быть другая проблема, которую следует исправить, а не искать обходной путь. Какой вывод на консоль при записи obj.splice(i, 1); console.dir(JSON.stringify(obj)); вместо delete obj[i]

t.niese 27.10.2018 17:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать delete и отфильтровать undefined

const obj= [{"id": 12}, {"id": 44}]
delete obj[0];
console.info(obj.filter(item => item));

НОsplice() работает нормально

const obj= [{"id": 12}, {"id": 44}]
obj.splice(0, 1);
console.info(obj);

Если вы фильтруете, зачем вообще удалять?

Jared Smith 27.10.2018 18:07

Да, я согласен, только фильтр поможет. Но в качестве OP использовал уже delete, поэтому я просто делаю фильтр undefined

Always Sunny 27.10.2018 18:10

Вы можете использовать Array.splice для этого

// The item index to remove
let index = 0;
let arr = [{id: 12}, {id: 44}];
arr.splice(index,1);
console.info("Array after removing item", arr);

Другие вопросы по теме