#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. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества и с большей вероятностью привлекут голоса.