javascript通过路径数组达到元素

use*_*512 7 javascript arrays object

我得到了这个路径数组:

const path = ["a", "b", "c", "d"]

和类似的对象:

let obj = { "a": { "b": { "c": { "d": 10, "e": 20 } } } }

我想删除那个,obj["a"]["b"]["c"]["d"]所以我obj

{ "a": { "b": { "c": { "e": 20 } } } }

我尝试做一些path.forEach循环,将其附加,但是找不到我想要附加的适当方式,因此我可以访问obj正确的位置。

谢谢您的帮助。

Nic*_*ons 12

您可以递归地执行此操作,然后delete在基本情况下使用来删除最终的键值对:

const path = ["a", "b", "c", "d"]
const obj = { "a": { "b": { "c": { "d": 10, "e": 20 } } } };

const remove_from_path = (obj, [prop, ...rest]) => 
  !rest.length ? delete obj[prop] : remove_from_path(obj[prop], rest);

remove_from_path(obj, path);
console.log(obj);
Run Code Online (Sandbox Code Playgroud)

  • 花了一些时间来理解该函数的第二个参数,我必须承认它非常聪明。绝对有趣。 (3认同)
  • @nickzoum没有人这么说。实际上,您的代码要快得多,但是for循环会更快。las,与for循环相比,此处提供的解决方案更短,更简洁,更易读。我不会说处理复杂的代码更重要,而是偏向于更易读,更短的代码-碰巧很复杂 (2认同)
  • 如果您不熟悉语法,则一定不熟悉它的功能。你可以这样说。我一直都在使用解构,所以这对我来说是可读的。我想它只是归结为经验,但是我发现编写答案时效率不高。我已经开始写简短的答案,然后是有效的答案以及jsperf,我认为这可能对新用户和正在寻找更快代码的用户有所帮助。 (2认同)

nic*_*oum 5

您可以遍历path数组并在每次迭代中访问obj对象的该属性。在最后一次迭代中,不要输入最后一个属性,而是将其删除。

var path = ["a", "b", "c", "d"];
var obj = { "a": { "b": { "c": { "d": 10, "e": 20 } } } };

path.reduce(function(result, key, index) {
  if (index === path.length - 1) delete result[key];
  else return result[key];
}, obj);

console.log(obj);
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 5

您可以保存最后一个键并将对象减少到最终对象。

const
    remove = (object, [...keys]) => {
        const last = keys.pop();
        delete keys.reduce((o, k) => o[k] || {}, object)[last];
    },
    path = ["a", "b", "c", "d"],
    obj = { a: { b: { c: { d: 10, e: 20 } } } };


remove(obj, path);
console.log(obj);
Run Code Online (Sandbox Code Playgroud)