通过索引删除JSON元素?

4

假设我有一个名为foo的JSON:

{
     "key" : "value",
     "one" : "two"
}

我想删除第一个元素,所以索引为0。但我不知道它的'key'是什么。
我尝试使用'delete foo[0]',但它没有起作用。它会输出'true',但实际上并没有真正删除它。
有没有一种方法可以在不循环遍历它的情况下完成这个任务?

你可以使用 Object.keys() 获取一个按照对象中键出现顺序排序的键数组。Object.keys(foo)[0] 将返回第一个键。要解决这个特定问题,只需使用:delete foo[Object.keys(foo)[0]]。 - Sergio Gonzalez
4个回答

9

使用Object.keys(JSON)[0]获取键,然后将其删除。


谢谢。我尝试了 delete foo[Object.keys(foo)[0]],它完美地运行了。(我会尽快接受这个答案) - Troughy
@Troughy请注意,虽然这种方法“可行”,但对象中项目的实际顺序不能保证。这意味着您希望删除的对象中的第一个项目可能最终成为第二个项目。如果您想保证顺序,最好使用数组。 - Chris
我确保索引始终正确。而且我使用JSON,因为我真的需要键值对。当然,也有用数组实现的方法,但如果JSON完美地解决了问题,为什么要使用数组呢? - Troughy

4

JSON对象属性没有像数组一样的顺序。然而,您可以通过以下方式获取属性列表:

Object.keys(foo);  // ["key","one"]

删除使用delete命令找到的第一个元素。

delete foo[ Object.keys(foo)[0] ]

在某些浏览器中,属性的顺序是由最先创建的属性决定的,但这并不是保证的,因此您不能依赖此顺序逻辑来删除任何属性。在属性枚举机制的步骤6.a(第一个算法)和步骤7.a(第二个算法)中,枚举属性的顺序和机制未作规定。在枚举过程中,被枚举对象的属性可能会被删除。如果在枚举过程中删除了尚未访问的属性,则该属性将不会被访问。如果在枚举过程中向正在被枚举的对象添加了新属性,则不能保证这些新添加的属性将在当前枚举中被访问到。在任何枚举中,属性名不能被重复访问。详见:https://www.ecma-international.org/ecma-262/5.1/#sec-12.6.4

3

您可以使用Object.keys获取对象的键列表。 一般来说,这不是一个好主意,所以也许需要考虑是否有更好的方法,但是以下是你尝试做到的代码:

test = {
     "key" : "value",
     "one" : "two"
}

delete test[Object.keys(test)[0]]

0

该对象不是数组,因此无法通过索引删除对象的元素但是,您可以获取对象键的数组。

Object.keys(foo)

现在我们有了数组,可以通过索引获取键。此外,我们还可以通过获取索引键来删除元素。
delete foo[Object.keys(foo)[index]];

编写原型是很方便的,这样代码就不会变得笨重。

Object.prototype.deleteByIndex = function(index) {
    delete this[Object.keys(this)[index]];
};

let foo = {
    "one": "test 1",
    "two": "test 2"
}

foo.deleteByIndex(0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接