在JavaScript中,如何不从对象返回字段?
例如,我得到了以下对象:在JavaScript中,如何不从对象返回字段?,javascript,Javascript,例如,我得到了以下对象: a = { "data": { "foo": { "name": "Alex" } }, "randomField": {} } 我的目标是返回以下对象(例如,删除randomField或返回a.data但保存密钥) 我正在考虑以下解决方案: return { data: a.data } 看起来我可以使用return{a.data}。如果您能够使用ES6,则可以使用解构来删除字段 const a = { "data"
a = {
"data": {
"foo": {
"name": "Alex"
}
},
"randomField": {}
}
我的目标是返回以下对象(例如,删除randomField或返回a.data但保存密钥)
我正在考虑以下解决方案:
return {
data: a.data
}
看起来我可以使用
return{a.data}代码>。如果您能够使用ES6,则可以使用解构来删除字段
const a = {
"data": {
"foo": {
"name": "Alex"
}
},
"randomField": {}
};
const { randomField, ...rest } = a;
return rest;
如果foo是您上面描述的对象
可能性1
返回{data:foo.data};
可能性2
删除foo.randomField;
返回foo;
请注意,如果将foo传递给函数,它将作为引用传递,因此对传递的对象所做的每个更改都将直接传递给原始对象。答案取决于代码的上下文。如果您只想从对象中删除键值对,则删除a.randomField
即可。您可以在之后返回a
,但请注意,如果从外部将a
传递到函数中,则会对其进行修改。换言之:
function foo(x) {
delete x.randomField;
return x;
}
将导致以下行为:
a = {
"data": {
"foo": {
"name": "Alex"
}
},
"randomField": {}
}
foo(a)
console.log(a.randomValue) // gives "undefined"
这种副作用通常被认为是一种危险的做法
另一个选项是创建新对象并复制除要删除的属性之外的所有属性。这种方法使您可以使用两种不同的方式来复制对象:深度复制和浅层复制。您使用{data:a.data}
所做的实际上是对象一部分的浅拷贝:虽然外部对象是新的,但内部对象a.data
仍然是相同的。考虑下面的代码:
function foo(x) {
return {data: x.data}
}
b = foo(a)
a.foo.name = "Bob";
console.log(b.foo.name) // Gives "Bob"
如果要传输单个属性,则创建局部浅层副本的方法是okayish,但如果要复制100个字段(只有一个例外),则会变得单调乏味。在这种情况下,您可以这样做:
function foo(x) {
y = {}
Object.keys(x).forEach(function(key) {
if (key !== "randomField") {
y[key] = x[key]
}
});
return y;
}
自IE9以来,它适用于所有现代浏览器。请注意,这仍然显示浅拷贝的属性,即b=foo(a)
之后修改a.data
也会导致b.data
的更改
然后是深度复制。正确地实现这些功能有点复杂。常见的方法包括将对象序列化为JSON,然后再次反序列化(这将导致一个全新的对象,它与序列化的原始对象完全分离)。执行此操作后,您可以删除copiedObject.randomField
,因为这将不再影响原始对象。但是,如果值不可序列化,序列化步骤可能会导致值丢失。因此,我强烈建议您查看lodashs。method(),如果您需要部分深度复制,请忽略它。有多种方法可以实现。这这似乎是最直接、最明显的解决办法——那么你到底在问什么呢?那么在你思考了之后,你在做这件事时遇到了什么问题?@charlietfl我想知道这是否是最流行的方式。最流行的方式完全是基于观点。。。您必须检查您的需求和目标是什么,正如Dave在第一条评论中所说,最明显的解决方案是a.data
,它简单而快速,但您必须检查这是否真的对您有帮助,例如,每个a
对象是否都有数据
属性等等。返回{a.data}代码>对我来说是一个语法错误。
function foo(x) {
y = {}
Object.keys(x).forEach(function(key) {
if (key !== "randomField") {
y[key] = x[key]
}
});
return y;
}