【问题标题】:How to recursively change JS Object/JSON values at any level?如何在任何级别递归更改 JS 对象/JSON 值?
【发布时间】:2018-03-04 12:41:14
【问题描述】:

请注意,我提供的结构只是一个示例,但可以是任何东西

主要目标是在任何级别递归地将我选择的键值更改为我选择的值。

这里是澄清的例子:

    var items = {
      price: 10,
      child: {
        price: 20, 
         child: {
           price: 10
         }
      },
      child2: {
        price: 40,
        child: {
          price: 50,
          child: [{ price: 30 }, { price: 40 }]
        }
      }
    };

鉴于此,您如何将所有价格更改为 0?

【问题讨论】:

  • 我投票结束这个问题,因为它过于宽泛,因为它似乎只是一个数据转储,请求其他人代表发布者进行数据转换工作。这里似乎没有任何代码可以解决问题。
  • 我主要想知道是否有一个库函数可以做到这一点,但是库问题也被否决了(虽然 Stack Overflow 上没有被否决的问题)。我已经搜索了谷歌,我想要的解决方案太复杂了。通过在这里提问,不到 5 分钟我得到了一个简单的答案……这不是重点吗?
  • 请注意,我没有否决这个问题,但我确实提名了这个问题以结束。在我看来,这个问题并没有真正提供任何证据表明在数据转储发布之前已做出任何努力来解决问题。其他人显然有不同的感觉,正如所提供的答案所证明的那样。虽然很高兴给出的答案可能会为您指明正确的方向,但我只是觉得这个问题在未来对其他人没有长期的积极用途。 (这是网站的基石,是一个 QA 存储库)。
  • 我只是想让问题尽可能清晰和整洁。我认为任何想要解决相同问题的人都会很高兴找到这些答案,因为他们的努力可能会将他们带到这里。我不明白我之前所做的研究如何与长期效果相关?他们可能只是想做同样的事情,登陆这里,得到答案,然后上路(因为这是一个非常普遍的场景,而不仅仅是针对我的需求的数据转储)。
  • 我唯一能真正解释的就是,Close Votes 和 Upvotes/Downvotes 都很有主见,每个人对这件事都有自己的看法,很多时候意见是基于情感的.每当您的问题感觉您是在将自己的工作“推卸”到他人身上,或者没有真正表现出任何努力时,您更有可能得到负面回应。在帮助指南how to write a good question 中,最重要的事情之一就是不仅要显示出了什么问题,而且要显示没有奏效

标签: javascript json nested key


【解决方案1】:

这是一个总体思路:

function f(obj, prop, val){
  if (typeof obj == 'object'){
    if (obj.hasOwnProperty(prop))
      obj[prop] = val;
      
    for (let i in obj)
      f(obj[i], prop, val);
  }
}

var items = {
  price: 10,
  child: {
    price: 20, 
     child: {
       price: 10
     }
  },
  child2: {
    price: 40,
    child: {
      price: 50,
      child: [{ price: 30 }, { price: 40 }]
    }
  }
};

f(items, 'price', 0);

console.log(JSON.stringify(items));

【讨论】:

    【解决方案2】:

    递归循环并检查密钥price

    var items = {  price: 10,  child: {    price: 20,    child: {      price: 10    }  },  child2: {    price: 40,    child: {      price: 50,      child: [{        price: 30      }, {        price: 40      }] }  }};
    
    function loop(obj) {
      if (typeof obj !== 'object') return;
      Object.keys(obj).forEach((k) => {
        if (k === 'price') obj[k] = 0;
        else loop(obj[k]);
      });
    }
    
    loop(items);
    
    console.log(items)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • loop([1,2,'price']) 似乎失败了
    • @גלעדברקן 是的,但是,这超出了范围。
    • 如何超出范围?我刚刚给它提供了数据:)
    • @גלעדברקן 根据问题正文超出范围
    • 引用问题:“我提供的结构只是一个例子,但它可以是任何东西”:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2021-08-07
    • 2019-10-26
    • 2022-11-30
    相关资源
    最近更新 更多