0

在 JavaScript 中,是否可以在 Array.find 上执行类似于可选链的操作?即,就像在下面的(不正确的)示例中一样?

let myArray = [{name: "foo", value: 30}, {name: "abc", value: 40}];
myArray.find(entry => entry.name === 'foo')?.value = 50;

我尝试了上面的语法,但它抛出了一个错误,我想知道是否有一些简洁的单行方法来实现这一点,而不必声明另一个变量来存储 Array.find 结果并在你可以之前检查它是否真实设定值 = 50。

4

4 回答 4

1

不,这是不可能的。您只能使用可选链接来读取值。

可选链接 (?.)

可选的链接运算符 (?.) 使您能够读取位于连接对象链深处的属性值,而无需检查链中的每个引用是否有效。

资源

如果你不想声明一个额外的变量,你可以调用相同的方法两次,用 a 组合&&来检查是否value有一个值,作为一种解决方法:

let myArray = [
  { name: "foo", value: 30 },
  { name: "abc", value: 40 },
];
myArray.find((entry) => entry.name === "foo").value &&
  (myArray.find((entry) => entry.name === "foo").value = 50);

console.log(myArray);

另一个变体是只try强制设置一个值......

let myArray = [
  { name: "foo", value: 30 },
  { name: "abc", value: 40 },
];

try { myArray.find((entry) => entry.name === "foo").value = 50; } catch {}
try { myArray.find((entry) => entry.name === "notfound").value = 50; } catch {}

console.log(myArray);

但两者都不是好的选择。

于 2021-09-02T21:18:29.037 回答
1

当你这样做时:

({a:1})?.a = 10

你真正在做的是:

1 = 10

这会导致与您观察到的相同的错误。因此,您不能使用可选链接来设置值。

假设您想改变数组的元素,您可以做的是使用??默认为空对象以防Array#find返回null。如果找到一个元素,您可以修改它,如果没有,您只需将 50 分配给立即丢弃的对象:

let myArray = [{name: "foo", value: 30}, {name: "abc", value: 40}];
(myArray.find(entry => entry.name === 'foo') ?? {}).value = 50;
于 2021-09-02T21:25:33.840 回答
0

您不能使用可选链接来设置值。它仅用于获取值。

于 2021-09-02T21:13:16.220 回答
0

如果您确实需要通过引用在没有变量的一行中分配值,则可以这样使用:

Object.assign(myArray.find(entry => entry.name === 'foo') ?? {}, {value: 50})

但是很脏

于 2021-09-02T21:20:03.537 回答