Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.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_Ecmascript 6 - Fatal编程技术网

Javascript 浅层克隆地图或集合

Javascript 浅层克隆地图或集合,javascript,ecmascript-6,Javascript,Ecmascript 6,如何在JavaScript中浅层克隆对象 我想获得具有相同键和值的新映射或集。使用构造函数克隆映射和集: var clonedMap = new Map(originalMap) var clonedSet = new Set(originalSet) 通过for循环创建新集合的速度比集合构造函数快。地图也是如此,尽管程度较低 const timeInLoop=(desc,loopCount,fn)=>{ 常量d=`${desc}:${loopCount.toeExponential()}

如何在JavaScript中浅层克隆对象


我想获得具有相同键和值的新映射或集。

使用构造函数克隆映射和集:

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)

通过for循环创建新集合的速度比集合构造函数快。地图也是如此,尽管程度较低

const timeInLoop=(desc,loopCount,fn)=>{
常量d=`${desc}:${loopCount.toeExponential()}`
控制台。时间(d)
for(设i=0;i{
常数y=新集合()
对于(x的常数项)y.添加(项)
返回y
}
常量映射=新映射([[a',1],[b',2],[c',3],[d',4],[e',5]]
常量mapFromForLoop=x=>{
常数y=新映射()
对于(x的常量项)y.set(…项)
返回y
}
timeInLoop('新集合(集合)',1e5,()=>新集合(集合))
timeInLoop('setFromForLoop(set'),1e5,()=>setFromForLoop(set))
timeInLoop('新映射(映射)',1e5,()=>新映射(映射))
timeInLoop('mapFromForLoop(map'),1e5,()=>mapFromForLoop(map))
我需要复制(“克隆”)一个JavaScript集,这个问题激发了我对克隆副本完整性的兴趣,并干扰了这些副本的源

测试

var-fruit=newset(['apples','bananas']);
var省=新设置(['不列颠哥伦比亚省','新斯科舍省]);
console.log('fruit:',fruit)
console.log('省:',省)
//水果:套装[“苹果”、“香蕉”]
//省份:集合[“不列颠哥伦比亚省”、“新斯科舍省”]
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set#implementing_basic_set_operations
功能集(setA、setB){
让_union=新集合(setA);
对于(让挫折的要素){
_union.add(元素)
}
回归联盟;
}
myUnionSet=UnionSet(水果,省份);
console.log('myUnionSet:',myUnionSet)
//myUnionSet:Set(4)[“苹果”、“香蕉”、“不列颠哥伦比亚”、“新斯科舍省”]
//测试:
水果。删除(“苹果”);
省。删除(“不列颠哥伦比亚省”);
console.log('fruit:',fruit)
console.log('省:',省)
console.log('myUnionSet:',myUnionSet)
//水果:套[“香蕉”]
//省份:集合[“新斯科舍省”]
//myUnionSet:Set(4)[“苹果”、“香蕉”、“不列颠哥伦比亚”、“新斯科舍省”]

如果映射包含非嵌套结构(例如数组映射),这里有一种快速的深度复制方法,供感兴趣的人使用:

const newMap = new Map();
old.forEach((val, key) => newMap.set(key, [...old.get(key)]));
浅克隆:

var clonedMap = new Map(originalMap)

var clonedSet = new Set(originalSet)
深度克隆:

var deepClonedMap = new Map(JSON.parse(JSON.stringify([...originalMap])))
var deepClonedSet = new Set(JSON.parse(JSON.stringify([...originalSet])))
let originalMap=new Map()
设data={a:'a',b:'b'}
原始映射集(1,数据)
let shallowCloned=新地图(原始地图)
让deepCloned=newmap(JSON.parse(JSON.stringify([…originalMap]))
data.a='p'
log('originalMap:',[…originalMap])
log('shallowCloned:',[…shallowCloned])

console.log('deepCloned:',[…deepCloned])
如何进行深度克隆?查看此提琴以了解如何对映射进行深度克隆:
map
应被视为抽象数据类型,而不是Javascript对象。因此,深度克隆一个
Map
是没有意义的。不幸的是,复制构造函数在IE 11中不起作用(创建了空映射)。很好的发现!可能值得在Chromium bug跟踪器上创建一个bug来引起他们的注意。这在发动机中肯定是固定的。类似地,Firefox的
Set
(虽然不是
Map
)也存在同样的问题。有趣的是,
newset(Set)
在Safari中大约快15-20毫秒,而
setFromForLoop(Set)
在Chrome中大约快20-28毫秒。这对年轻开发者来说是有趣但危险的信息。除非您现在绝对必须拥有尽可能快的时间,否则最好使用构造函数方法,因为正如@JoLiss所指出的,这是一个bug,会得到修复——这是其他人的问题,所以您可以编写的代码越少越好!OP要求一个浅克隆的想法是肯定的,但如果你看评论,有些人来寻找一个深克隆的方法。我也这么做了,但没有找到答案,所以我为可能感兴趣的人添加了答案。最上面的答案很好,所以我不需要重复同样的事情