我正在尝试删除数组中的对象。
情况如下。
在代码中,我生成了一个新的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"}
但是它是空的。我该如何解决?
答案 0 :(得分:1)
您可以使用.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.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)
答案 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)
具有posts
和newPost
变量,您可以使用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; }