Удалить объект из многомерного массива

Я пытаюсь удалить объект из массива.

Ситуация следующая.

В коде я создаю новый объект 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"}

Но там пусто. Как я могу это решить?

Возможный дубликат Удалить объект из массива объектов

Kresimir 07.12.2018 10:15

Извини, я виноват. var post_array = [{objectKey: «1», поле: «Kommentar1», значение: «kommentar123», тип: «text»}, {objectKey: «2», поле: «Color», значение: «red», тип : "текст"}]

user7370619 07.12.2018 10:44
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
1 430
5

Ответы 5

Вы можете использовать .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);
}

Codepen demo

Если вы хотите удалить элемент с тем же полем, вам нужно просто сравнить в 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 ", тип:" текст "}]

user7370619 07.12.2018 10:43

В общем, удалить элемент из массива непросто, если только это не последний элемент (в этом случае вы можете просто использовать функцию 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; }

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