【问题标题】:Remove key: value pair from nested objects从嵌套对象中删除键:值对
【发布时间】:2020-04-19 11:17:09
【问题描述】:

我有这个对象:

const myObject = {
  myNestedObject1: {
    key1: "key1",
    key2: "key2",
    key3: "key3"
  },
  myNestedObject2: {
    key1: "key1",
    key2: "key2",
    key3: "key3"
  },
  myNestedObject3: {
    key1: "key1",
    key2: "key2",
    key3: "key3"
  }
}

我想获得一个新的类似对象,但没有键值对key2: "key2",并且不改变原始对象。

const myObject = {
  myNestedObject1: {
    key1: "key1",
    key3: "key3"
  },
  myNestedObject2: {
    key1: "key1",
    key3: "key3"
  },
  myNestedObject3: {
    key1: "key1",
    key3: "key3"
  }
}

有什么简单的方法吗?可能是洛达什?

谢谢!


根据要求,这是我正在尝试的:

const myObject = {
  myNestedObject1: {
    key1: "key1",
    key2: "key2",
    key3: "key3",
  },
  myNestedObject2: {
    key1: "key1",
    key2: "key2",
    key3: "key3",
  },
  myNestedObject3: {
    key1: "key1",
    key2: "key2",
    key3: "key3",
  },
};

 result = _.transform(
  Object.assign({}, myObject),
  (acc, value, key) => {
    delete value["key2"]

    acc[key] = value;
  },
  {}
);

这会产生所需的对象,但会改变原始对象。

【问题讨论】:

  • 到目前为止你有什么尝试?请张贴代码,

标签: javascript object lodash


【解决方案1】:

您可以使用Object.entries()Object.fromEntries()Array.prototype.map() 来实现。

const myObject = {myNestedObject1: {key1: "key1",key2: "key2",key3: "key3"}, myNestedObject2: {key1: "key1",key2: "key2",key3: "key3"}, myNestedObject3: {key1: "key1",key2: "key2",key3: "key3"}};

const res = Object.fromEntries(Object.entries(myObject).map(([key, value]) => {
   const {key2, ...rest} = value; // Get all the keys except key2 at ...rest
   return [key, rest];
}));

console.log(res);
.as-console-wrapper {min-height: 100% !important; top: 0;}

更新

在这里,我提出了一种使用reduce 的替代方法。

const myObject = {myNestedObject1: {key1: "key1",key2: "key2",key3: "key3"}, myNestedObject2: {key1: "key1",key2: "key2",key3: "key3"}, myNestedObject3: {key1: "key1",key2: "key2",key3: "key3"}};

const res = Object.entries(myObject).reduce((acc, [key, value]) => {
	const {key2, ...rest} = value;
	return {...acc, [key]: rest}
}, {});

console.log(res);
.as-console-wrapper {min-height: 100% !important; top: 0;}

【讨论】:

  • 这很有趣,但是如果您的嵌套对象有很多条目怎么办?在这种情况下,最好删除不需要的条目而不是添加所需的条目......
  • 感谢您的回复@EmilleC。请检查我的更新答案。
  • 是的,展开运算符,是有道理的……不完全了解 fromEntries 在这里的工作原理,是阅读它的好时机。谢谢!
  • 此解决方案有一个缺点:fromEntries 未得到广泛支持,因此其他替代方案会很棒
  • 嘿@EmilleC。您应该使用任何 JavaScript 编译器/转换器,例如 Babel 以获得浏览器支持并接受新的 ES 功能。
【解决方案2】:

您可以简单地遍历对象并删除对象属性:

const myObject = {
  myNestedObject1: {
    key1: "key1",
    key2: "key2",
    key3: "key3",
  },
  myNestedObject2: {
    key1: "key1",
    key2: "key2",
    key3: "key3",
  },
  myNestedObject3: {
    key1: "key1",
    key2: "key2",
    key3: "key3",
  },
};
const result = JSON.parse(JSON.stringify(myObject)); //make a shallow copy of the object
for(let o in result){
  delete result[o]['key2'];
}
console.log(result);

【讨论】:

  • on side note:- 问题是Which produces the desired object, but mutates the original one. 所以你的回答也是如此,我认为 op 需要一种不可变的方式来处理这个问题
  • 对不起,这是作为缺点添加到我的解决方案中的:我想避免突变。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2017-05-03
  • 2019-03-29
  • 2020-12-07
相关资源
最近更新 更多