从多维数组中删除对象

时间:2018-12-07 08:52:33

标签: javascript jquery

我正在尝试删除数组中的对象。

情况如下。

在代码中,我生成了一个新的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);

那很好。 我不想在post_array中具有相同的objectKey和相同的字段的new_post_obj。 为此,我想删除post_array中与我要发布的新对象具有相同objectKey和字段的发布对象。然后推送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"}

但是它是空的。我该如何解决?

5 个答案:

答案 0 :(得分:1)

您可以使用.filter来过滤掉先前与objectKeyfield相同的项目:

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.log(output);

答案 1 :(得分:1)

通常,从数组中删除元素并不容易,除非它是最后一个元素(在这种情况下,您可以简单地使用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

答案 2 :(得分:0)

例如,您可以使用 StringUtils.join(packageCategories,",") 将新帖子推送到数组中,然后检查是否已包含新帖子

some(),
  

Codepen demo

答案 3 :(得分:0)

如果您要删除具有相同字段的项目,则只需在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.log(post_array)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

答案 4 :(得分:0)

具有postsnewPost变量,您可以使用Array.prototype.reduce()Spread syntax组合仅一行完成所有操作

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.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }