标签: spread-syntax

如何深度合并而不是浅合并?

无论Object.assign对象传播只能做一浅合并.

问题的一个例子:

// No object nesting
const x = { a: 1 }
const y = { b: 1 }
const z = { ...x, ...y } // { a: 1, b: 1 }
Run Code Online (Sandbox Code Playgroud)

输出是你所期望的.但是如果我试试这个:

// Object nesting
const x = { a: { a: 1 } }
const y = { a: { b: 1 } }
const z = { ...x, ...y } // { a: { b: 1 } }
Run Code Online (Sandbox Code Playgroud)

代替

{ a: …
Run Code Online (Sandbox Code Playgroud)

javascript spread-syntax

289
推荐指数
22
解决办法
14万
查看次数

状态为对象数组与由id键入的对象

设计状态形状的章节中,文档建议将您的状态保存在由ID键入的对象中:

将每个实体保存在以ID作为密钥存储的对象中,并使用ID从其他实体或列表中引用它.

他们继续陈述

将应用程序的状态视为数据库.

我正在处理状态形状以获取过滤器列表,其中一些将打开(它们显示在弹出窗口中),或者已选择选项.当我读到"将应用程序的状态视为数据库"时,我考虑将它们视为JSON响应,因为它将从API(本身由数据库支持)返回.

所以我一直在考虑它

[{
    id: '1',
    name: 'View',
    open: false,
    options: ['10', '11', '12', '13'],
    selectedOption: ['10'],
    parent: null,
  },
  {
    id: '10',
    name: 'Time & Fees',
    open: false,
    options: ['20', '21', '22', '23', '24'],
    selectedOption: null,
    parent: '1',
  }]
Run Code Online (Sandbox Code Playgroud)

但是,文档建议更像一种格式

{
   1: { 
    name: 'View',
    open: false,
    options: ['10', '11', '12', '13'],
    selectedOption: ['10'],
    parent: null,
  },
  10: {
    name: 'Time & Fees',
    open: false,
    options: ['20', '21', '22', '23', '24'],
    selectedOption: null,
    parent: …
Run Code Online (Sandbox Code Playgroud)

javascript spread-syntax redux

87
推荐指数
3
解决办法
2万
查看次数

使用扩展语法在ES6中进行深层复制

我正在尝试为我的Redux项目创建一个深度复制映射方法,该方法将使用对象而不是数组.我读到在Redux中,每个州都不应该改变以前的状态.

export const mapCopy = (object, callback) => {
    return Object.keys(object).reduce(function (output, key) {

    output[key] = callback.call(this, {...object[key]});

    return output;
    }, {});
}
Run Code Online (Sandbox Code Playgroud)

有用:

    return mapCopy(state, e => {

            if (e.id === action.id) {
                 e.title = 'new item';
            }

            return e;
        })
Run Code Online (Sandbox Code Playgroud)

但是它没有深层复制内部项目所以我需要调整它:

export const mapCopy = (object, callback) => {
    return Object.keys(object).reduce(function (output, key) {

    let newObject = {...object[key]};
    newObject.style = {...newObject.style};
    newObject.data = {...newObject.data};

    output[key] = callback.call(this, newObject);

    return output;
    }, {});
}
Run Code Online (Sandbox Code Playgroud)

这不太优雅,因为它需要知道传递了哪些对象.ES6中是否有一种方法可以使用扩展语法来深度复制对象?

javascript ecmascript-6 spread-syntax redux

79
推荐指数
6
解决办法
8万
查看次数

为什么 {....0}评价为{}?

我刚刚{....0}在朋友的代码中找到了.在控制台返回中评估它{}(空对象).

这是为什么?JavaScript中4个点的含义是什么?

javascript number-literal spread-syntax

78
推荐指数
3
解决办法
8988
查看次数

使用扩展语法和带有typescript的新Set()

我使用以下代码来获取唯一的数字:

let uniques = [ ...new Set([1, 2, 3, 1, 1]) ]; // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

但是,typescript报告跟随错误:类型"Set"不是数组类型. 我不是打字稿忍者,有人能告诉我这里有什么问题吗?

javascript typescript ecmascript-6 spread-syntax

68
推荐指数
6
解决办法
2万
查看次数

ES2015/ES6中的Spread语法与Rest参数

我对ES2015中的spread语法和rest参数感到困惑.任何人都能用适当的例子来解释它们之间的区别吗?

javascript variadic-functions ecmascript-6 spread-syntax

55
推荐指数
5
解决办法
2万
查看次数

ECMAScript文档中的SpreadElement是什么?它与MDN上的Spread语法相同吗?

ECMAScript规范SpreadElement描述

SpreadElement[Yield]:
...AssignmentExpression[In, ?Yield]
Run Code Online (Sandbox Code Playgroud)

这与Spread语法相同

扩展语法允许在可能需要零个或多个参数(用于函数调用)或元素(用于数组文字)的位置扩展数组表达式或字符串等可迭代的值,或者在零或更多的位置扩展对象表达式键值对(对象文字)是预期的.

句法

对于函数调用:

myFunction(...iterableObj);
Run Code Online (Sandbox Code Playgroud)

对于数组文字:

[...iterableObj, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

MDN文档中描述?

什么是SpreadElement和/或扩展语法的用例; 如果SpreadElement和传播语法不同,它们的具体方式有何不同?

javascript ecmascript-6 spread-syntax

42
推荐指数
1
解决办法
3733
查看次数

扩展语法如何影响数组拼接

我找到了以下代码,我不知道A和B之间有什么区别:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
Run Code Online (Sandbox Code Playgroud)

一个

fruits.splice(2,0,["Lemon", "Kiwi"]);
Run Code Online (Sandbox Code Playgroud)

fruits.splice(...[2,0].concat(["Lemon", "Kiwi"]));
Run Code Online (Sandbox Code Playgroud)

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var A = fruits.splice(2, 0, ["Lemon", "Kiwi"]);
var B = fruits.splice(...[2, 0].concat(["Lemon", "Kiwi"]));

console.log(A)
console.log(B)
Run Code Online (Sandbox Code Playgroud)

javascript arrays spread-syntax

35
推荐指数
5
解决办法
2942
查看次数

是...... foo是运算符还是语法?

我听说...两者都称为"传播语法 "和"传播运算符 ",后者更受欢迎.相关MDN文档的URL 表明它最初被称为扩展运算符,但后来改为扩展语法,MDN的运算符列表没有提到它.

Google似乎认为术语运营商更受欢迎并被接受,其中包括Microsoft文档es6-features.org等网站.

哪个术语在ECMAScript的上下文中最正确,如果有的话,为什么?数组解构赋值怎么样?

javascript language-lawyer ecmascript-6 spread-syntax

30
推荐指数
2
解决办法
1843
查看次数

传播语法ES6

请考虑以下示例代码

var x = ["a", "b", "c"];
var z = ["p", "q"];

var d = [...x, ...z];

var e = x.concat(z);
Run Code Online (Sandbox Code Playgroud)

在这里,价值de是完全相同且等于 ["a", "b", "c", "p", "q"],所以,

  1. 这两者究竟有什么区别?
  2. 哪一个更有效率,为什么?
  3. 扩展语法的用途究竟是什么?

难道你不认为用正式的广泛语言引入这些小捷径可能会留下一些未被注意的错误,我的意思是要么是非常不必要的,要么我没有意识到它是否需要正确.

javascript ecmascript-6 spread-syntax

27
推荐指数
2
解决办法
3616
查看次数