如何使用 JQuery 或 Javascript 使用动态路径从 JSON 对象中删除

Posted

技术标签:

【中文标题】如何使用 JQuery 或 Javascript 使用动态路径从 JSON 对象中删除【英文标题】:How to delete from JSON Object using dynamic path using JQuery or Javascript 【发布时间】:2019-07-08 01:54:50 【问题描述】:

我有一个 JSON 对象“person”,我需要删除一个键“age”,它应该作为参数传递给函数,如下面的示例所示。在函数内部,删除密钥的语句被添加为delete person+key;,但它不起作用。请建议以以下方式删除密钥的方法,因为我必须在“p”元素单击时动态删除密钥。

<!DOCTYPE html>
<html>
    <head>
        <script>
          var person = 
            firstname: "John",
            lastname: "Doe",
            age: 50,
            eyecolor: "blue"
          ;
          function funToDelete(key)
            delete person+key;
            document.getElementById("demo").innerHTML =
            person.firstname + " is " + person.age + " years old.";
          
        </script>
    </head>
    <body>
        <p id="demo"></p>
        <p onclick="funToDelete('.age')">Click me</p>
    </body>
</html>

【问题讨论】:

使用delete person[key] 不要将参数作为 '.age.而是只使用 'age' 并在删除时使用 delete person[key] (person['age']) 我在上面添加了一个简单的 JSON 示例。但在我的实际情况中,对象是复杂和动态的,所以我需要传递对象路径“.category[1].additionalinfo”(只是一个例子)来删除对象内部的一个元素 在调用函数写入时动态传递密钥,例如删除密钥delete person.key;,如果您传递想要打印的 person.firstname、person.age 等密钥,则将打印 undefined 【参考方案1】:

使用带有方括号表示法的delete 运算符:

const person = 
  firstname: "John",
  lastname: "Doe",
  age: 50,
  eyecolor: "blue"
;
const key = 'age';

delete person[key];

console.log(person);

【讨论】:

【参考方案2】:

使用括号表示法[]:

delete person[key];

这样调用:

funToDelete("age");

演示:

var person = 
  firstname: "John",
  lastname: "Doe",
  age: 50,
  eyecolor: "blue"
;

function funToDelete(key) 
  delete person[key];
  document.getElementById("demo").innerHTML =
    person.firstname + " is " + person.age + " years old.";
<p id="demo"></p>
<p onclick="funToDelete('age')">Click me</p>

注意 - 由于您要删除 age,因此上面显示的是 undefined

【讨论】:

【参考方案3】:

您应该使用 [] 运算符而不是 +。因为您想使用变量访问对象中的属性。代码应该是

delete person[key]

方括号表示法用于使用变量名称或表达式访问对象的属性。

<!DOCTYPE html>
<html>
    <head>
        <script>
          var person = 
            firstname: "John",
            lastname: "Doe",
            age: 50,
            eyecolor: "blue"
          ;
          function funToDelete(key)
            delete person[key]; // This is where the key gets evaluated to a sting
            document.getElementById("demo").innerHTML =
            person.firstname + " is " + person.age + " years old.";
          
        </script>
    </head>
    <body>
        <p id="demo"></p>
        <p onclick="funToDelete('age')">Click me</p>
    </body>
</html>

【讨论】:

【参考方案4】:

当您希望通过变量访问密钥时,请使用 Bracket Notation 。 你应该delete[key]只传递age作为参数而不是.key

var person = 
            firstname: "John",
            lastname: "Doe",
            age: 50,
            eyecolor: "blue"
          ;
          function funToDelete(key)
            delete person[key];
            document.getElementById("demo").innerHTML =
            person.firstname + " is " + person.age + " years old.";

 
<p id="demo"></p>
        <p onclick="funToDelete('age')">Click me</p>

【讨论】:

【参考方案5】:

基于此OP 评论:

我在上面添加了一个简单的 JSON 示例。但在我的实际情况下,对象是复杂和动态的,所以我需要传递对象路径“.category[1].additionalinfo”(只是一个例子)来删除对象内部的一个元素

更通用的方法是通过key 路径,split() 传递dot 并使用reduce() 获取要删除的密钥:

var person = 
  firstname: "John",
  lastname: "Doe",
  age: 50,
  eyecolor: "blue",
  foo: bar: "something"
;

function funToDelete(pathToKey)

    let keys = pathToKey.split(".");

    let toDelete = keys.reduce((acc, key, idx, arr) =>
    
        if (idx < arr.length - 1) acc = acc[key];
        return acc;
    , person);

    delete toDelete[keys[keys.length - 1]];
    console.log(person);
<p id="demo"></p>
<p onclick="funToDelete('foo.bar')">Click me</p>

【讨论】:

以上是关于如何使用 JQuery 或 Javascript 使用动态路径从 JSON 对象中删除的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 或 jQuery 更改数组内对象的值?

如何使用 jquery 或 javascript 删除索引处的行? [复制]

如何使用 jQuery 或 JavaScript 设置底边距

如何使用 PHP 或 JavaScript/jQuery 禁用地址栏?

如何防止使用 jQuery 或 Javascript 进行双重提交?

当您使用 javascript 或 jquery 将鼠标悬停时,如何使图像或按钮发光?