为什么我的map()扩展语法不起作用?

时间:2017-12-18 09:45:45

标签: javascript dictionary spread-syntax

我真的没有看到这出错的地方。我从O'Reilly的学习反应中看过这个特例的帖子,由Banks& Porcello。但是,这些帖子似乎工作正常,但我的例子没有。如果我有拼写错误,我看不到它。哪里是我的缺点?我不知道为什么我得到一个空字符串值而不是“HB Woodlawn”

var subscription =
    source
        .TakeWhile(data => webSocket.State == WebSocketState.Open)
        .SelectMany(data =>
            Observable.FromAsync(() =>
                webSocket.SendAsync(data.ToString(), WebSocketMessageType.Text, true, CancellationToken.None)))
        .Catch<WebSocketException>(ex =>
            Observable.FromAsync(() =>
                webSocket.CloseAsync(WebSocketCloseStatus.Empty, String.Empty, CancellationToken.None)))
        .Subscribe();

2 个答案:

答案 0 :(得分:5)

let schools = [
  {name: 'Yorktown'},
  {name: 'Stratford'},
  {name: 'Washington & Lee'},
  {name: 'Wakefield'}
];

const editName = (oldName, newName, arr) =>
  arr.map(item => {
    if (item.name === oldName) {
      return {
        ...item,
        name: newName
      }
    }
    else {
      return item
    }
  });

let updatedSchools = editName('Stratford', 'HB Woodlawn', schools);

console.log(updatedSchools[1]);  // name: ""
console.log(schools[1]);  // name: "Stratford"

您没有为名称添加新值,而是将其留空。添加了name:newName

答案 1 :(得分:0)

您当然不需要这样做:

...item,
name: newName

一旦您进行了传播复制,并将其保留为纯函数,您就可以返回新值,并映射将通过回调函数获取它。

因此,对您的问题的更好答案是,您实际上是在打错字,写的是名称,而不是新名称。本书中将该变量称为 name ,然后,一旦您重写了该函数,就已经忘了所有的内容了:)。

只需更改行;

  return {
    ...item,
    name
  }

  return {
    ...item,
    newName
  }

这更干净:)。