Удалить из массива объекта, если он пуст

#javascript #reactjs

Вопрос:

У меня есть массив объектов ,

 var  arr = [
  {qty_auth: "", resolution: "4", status: "", order: "1495"},
  {qty_sized: "1", resolution: "4", status: "", order: "1485"}
]
 

Если первый из них пуст (например: qty_auth), необходимо удалить объект из массива в цикле. Первый — динамический ключ как qt_auth, qty_sized является динамическим

Таким образом, вывод должен быть

 var  arr = [
  {qty_sized: "1", resolution: "4", status: "", order: "1495"}
]
 

Комментарии:

1. Это недопустимый массив javascript — когда вы это выясните, посмотрите на Array.filter()

2. Для объекта в JS вы не можете точно сказать, какое свойство является первым, а какое — вторым. Вместо этого вы можете сохранить список свойств / атрибутов, которые вы хотите проверить, а затем проверить, могут ли они быть пустыми один за другим.

3. Вы концептуально хотите отфильтровать массив, поэтому Array.prototype.filter — это то, что вы ищете. Сложность в том, что вы хотите использовать условие, основанное на первом ключе объекта, которое может меняться от случая к случаю. Это невозможно. Объекты Javascript определяются как неупорядоченные пары ключ-значение. Когда вы перебираете ключи объекта, порядок зависит от реализации. У вас нет никаких гарантий относительно порядка ключей объекта.

4. Итак, чтобы успешно отфильтровать ваш массив, вам нужно заранее знать имя ключей, которые вы хотите проверить в своем условии фильтрации (функция, которую вы предоставляете Array.prototype.filter ). Если существует несколько возможных ключей, вам нужно проверить их все для каждого объекта в массиве.

Ответ №1:

В объекте в JS нет определенной последовательности, но то, что вы можете сделать, это проверить наличие и отфильтровать только тот объект, который содержит qty_auth или qty_sized , и он не должен быть пустым "" . Вы можете использовать filter

 var arr = [
  { qty_auth: "", resolution: "4", status: "", order: "1495" },
  { qty_sized: "1", resolution: "4", status: "", order: "1485" },
];

const result = arr.filter((o) => o.qty_auth || o.qty_sized);
console.log(result); 

ОТРЕДАКТИРОВАНО: если вы хотите отфильтровать объекты, которые начинаются с qty и которые пусты, вы можете сделать так:

 var arr = [
  { qty_auth: "", resolution: "4", status: "", order: "1495" },
  { qty_sized: "1", resolution: "4", status: "", order: "1485" },
];

const result = arr.filter((o) =>
  Object.keys(o).some((k) => k.startsWith("qty") amp;amp; o[k])
);
console.log(result); 

Комментарии:

1. ключ объекта будет динамическим. Как он будет динамичным, если я добавлю приведенный выше код? @decpk

2. динамический как? Я имею в виду, если в объекте есть 100 свойств, то какое свойство проверять. Должен быть какой-то критерий

3. Если что-то начинается с qty, и это значение объекта пустое

4. Отредактированное решение @ShantalKaula

5. Например, я должен проверить условие, при котором он находится внутри объекта items: 0: {qty_approved: "1", resolution: "5", status: "", order_item_id: "1332"} 1: {qty_approved: "", resolution: "5", status: "", order_item_id: "1332"} . будет ли работать приведенный выше код? @decpk

Ответ №2:

  • Используя Array#filter , выполните итерацию по массиву
  • На каждой итерации проверяйте, имеет ли текущий объект ключ, начинающийся с qty_ . Вы можете сделать это с помощью Object#keys , Array#find , и String#startsWith . Если ключ существует, но его значение пустое, верните false
 const arr = [ {qty_auth: "", resolution: "4", status: "", order: "1495"}, {qty_sized: "1", resolution: "4", status: "", order: "1485"} ];

const res = arr.filter(e => {
  const qtyKey = Object.keys(e).find(key => key.startsWith('qty_'));
  if(qtyKey amp;amp; !e[qtyKey]) return false;
  return true;
});

console.log(res); 

Примечание: порядок ключей в объектах javascript не определен.

Комментарии:

1. что, если это объект объекта? @Majed Badawi

2. Что вы имеете в виду?

3. const arr = { {qty_auth: "", resolution: "4", status: "", order: "1495"}, {qty_sized: "1", resolution: "4", status: "", order: "1485"} }; в этом случае как это будет работать?

4. Это недопустимый json, можете ли вы подробнее

5. Я готовлю массив, подобный этому `datas [1] = { «qty_sized»: «, «разрешение»: «5», «статус»: «», «порядок»: 1342 };` а затем я помещаю массив в объект items, с присвоением Object.assign(mydatadata.items, datas); теперь mydata.items имеетнабор массивов, из которого мне нужно проверить, является ли qty_sized пустым, затем удалить и, если qty_auth имеет значение, сохранить его. @Majed Badawi

Ответ №3:

попробуйте что-то вроде этого

 const filtered = arr.filter(({ qty_auth, qty_sized }) => (qty_auth || qty_sized));
 

Комментарии:

1. Добавлен динамический ключ, который загружается из других данных.

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

Ответ №4:

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

 const removeEmpty = (arr) => {
    const arrToReturn = new Array();

    arr.forEach((obj) => {
        if (Object.entries(obj)[0][1] === '') continue;
        else arrToReturn.push(obj);
    });

    return arrToReturn;
}
 

Комментарии:

1. Я совершенно уверен, что порядок записей объекта не гарантируется и зависит от используемого движка Javascript. Объекты в Javascript определяются как неупорядоченные наборы пар ключ-значение. Таким образом, вы не можете полагаться на порядок здесь.

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