Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中,如何不从对象返回字段?_Javascript - Fatal编程技术网

在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;
}