Я пытаюсь удалить объект из массива.
Ситуация следующая.
В коде я создаю новый объект Post, который помещаю в post_array.
var field = "Kommentar";
var objectKey = 1;
var new_post_obj = {objectKey: objectKey, field: field, value: new_value, type: "text"};
post_array.push(new_post_obj);
Работает нормально. Я не хочу иметь new_post_obj в post_array с тем же objectKey и тем же полем. Для этого я хотел бы удалить объекты сообщения в post_array, которые имеют тот же объектный ключ и поле, что и новый объект, который я хочу опубликовать. А затем нажмите new_post_obj.
Например, post_array содержит следующие данные:
[
{objectKey: "1", field: "Kommentar1", value: "kommentar123", type: "text"},
{objectKey: "1", field: "Color", value: "red", type: "text"}
]
У моего new_post_obj есть эти новые данные
{objectKey: "1", field: "Kommentar1", value: "kommentar123456", type: "text"}
Теперь мне нужно удалить старые данные с помощью objectKey: 1 и поля: «Kommentar1».
Я пробовал следующий код:
post_array = $.grep( post_array, function(n) {
return (n.field != field && n.objectKey != objectKey);
});
После этого я ожидаю, что мой post_array имеет только это значение:
{objectKey: "2", field: "Color", value: "red", type: "text"}
Но там пусто. Как я могу это решить?
Извини, я виноват. var post_array = [{objectKey: «1», поле: «Kommentar1», значение: «kommentar123», тип: «text»}, {objectKey: «2», поле: «Color», значение: «red», тип : "текст"}]



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать .filter, чтобы отфильтровать предыдущие элементы с такими же objectKey и field:
const input = [
{objectKey: "1", field: "Kommentar1", value: "kommentar123", type: "text"},
{objectKey: "2", field: "Color", value: "red", type: "text"}
]
const newObj = {objectKey: "1", field: "Kommentar1", value: "kommentar123456", type: "text"};
const output = input
.filter(({ objectKey, field }) => objectKey !== newObj.objectKey && field !== newObj.field)
.concat(newObj);
console.info(output);Вы можете проверить, добавлен ли уже новый пост, прежде чем помещать его в массив, используя some(),, например.
let posts = [
{ objectKey: "1", field: "1", value: "", type: "text"},
{ objectKey: "2", field: "2", value: "", type: "text"},
{ objectKey: "3", field: "3", value: "", type: "text"}
];
let newPost = { objectKey: "2", field: "2", value: "", type: "text"};
let isAlreadyInserted = posts.some((p) => {
return p.objectKey === newPost.objectKey && p.filter === newPost.filter;
});
if (!isAlreadyInserted) {
posts.push(newPost);
}
Если вы хотите удалить элемент с тем же полем, вам нужно просто сравнить в grep, чтобы поместить те, которые имеют другое значение, в «поле»
Учтите, что в новое поле необходимо поставить Kommentar1.
var post_array = [
{objectKey: "1", field: "Kommentar1", value: "kommentar123", type: "text"},
{objectKey: "1", field: "Color", value: "red", type: "text"}
]
var field = "Kommentar1"
var objectKey = "1"
post_array = $.grep( post_array, function(n) {
return (n.field != field);
});
console.info(post_array)<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>В порядке. Извини, я виноват. post_array должен быть var post_array = [{objectKey: "1", field: "Kommentar1", value: "kommentar123", type: "text"}, {objectKey: "2", field: "Color", value: "red ", тип:" текст "}]
В общем, удалить элемент из массива непросто, если только это не последний элемент (в этом случае вы можете просто использовать функцию pop()). Так работают массивы.
Способ удалить элемент в произвольной позиции - создать другой массив, содержащий все элементы исходного массива, кроме элемента, который вы хотите удалить. Чтобы сделать это, простой способ - просмотреть каждый элемент в исходном массиве, сравнить его с элементом, который вы хотите удалить, и, если результат сравнения ложный, вставить элемент в массив результатов.
let original = [{objectKey: "1", field: "Kommentar1", value: "kommentar123", type: "text"},
{objectKey: "2", field: "Color", value: "red", type: "text"}];
let result = [];
for (element of original) {
if (!(element.objectKey === "1" && element.field === "Kommentar1")) {
result.push(element);
}
}
Теперь, конечно, вы можете поместить это в функцию, которая будет принимать исходный массив и критерий удаления в качестве аргументов. Что-то вроде deleteElement(arr, id, field), но это легко реализовать, если вы понимаете, что он должен делать.
Уже есть встроенная функция, которая делает нечто подобное (но гораздо более мощное), и называется filter(). Вы можете прочитать об этом здесь:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
Имея переменные posts и newPost, вы можете делать все в одной строке, используя Array.prototype.reduce () в сочетании с Синтаксис распространения
post.reduce((a, c) => [...a, c.objectKey === newPost.objectKey && c.field === newPost.field ? c : newPost], []);
Пример кода:
const posts = [{objectKey: "1", field: "Kommentar1", value: "kommentar123", type: "text"}, {objectKey: "2",field: "Color", value: "red", type: "text"}];
const newPost = {objectKey: "1", field: "Kommentar1", value: "kommentar123456", type: "text"};
const result = posts.reduce((a, c) => [...a, c.objectKey === newPost.objectKey && c.field === newPost.field ? c : newPost], []);
console.info(result);.as-console-wrapper { max-height: 100% !important; top: 0; }
Возможный дубликат Удалить объект из массива объектов