我一直在这里冲浪一段时间,仍然没有找到适合我的答案.
有没有办法在JS中深层复制非普通对象?
我已经尝试了,jQuery.extend(true, {}, this)
但它只克隆了一些,剩下的仍然是另一个对象的参考.
我有一些表单数据,我通过道具与子组件共享。现在我想克隆 prop 对象并使其无反应。就我而言,我希望用户能够在不实际更改克隆值的情况下修改 props 值。克隆值应该只用于向用户显示编辑时表单的内容。下面的代码显示了这一点:
<template>
<div>
<div v-if="computedFormData">
original prop title: {{orgData.title}}
new title:
<input type="text" v-model="formData.title"/>
//changing data here will also change orgData.title
</div>
</div>
</template>
<script>
export default {
props: ['formData'],
data() {
return {
orgData: [],
}
},
computed: {
computedFormData: function () {
this.orgData = this.formData;
return this.orgData;
},
},
methods: {
},
}
</script>
Run Code Online (Sandbox Code Playgroud)
我试过Object.freeze(testData);
但它不起作用,testData 和 orgData 都是反应性的。另请注意,使用mounted
或created
属性不会呈现 orgData,因此我被迫使用该computed
属性。
考虑下面的代码或检查这个小提琴.
var obj = {
name: "abc",
age: 20
}
var objTwo;
console.log(obj.age);
objTwo = obj;
objTwo.age = 10;
console.log(obj.age);
Run Code Online (Sandbox Code Playgroud)
我创建了一个名为obj的对象,它有两个属性.现在我将obj分配给另一个名为objTwo的对象.现在我更新objTwo中的一个属性.同样的变化也反映在obj上.如何在不创建引用的情况下将值从一个对象分配给另一个对象?
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
Run Code Online (Sandbox Code Playgroud)
我一直在使用这段代码来创建从以前的代码继承的新对象.但是我遇到了一点意外.
a = {
foo: [1,2,3]
}
b = Object.create(a);
// b.foo -> [1,2,3]
b.foo = "test";
// b.foo -> "test"
// a.foo -> [1,2,3]
c = Object.create(a);
// c.foo -> [1,2,3]
c.foo[0] = 'test';
// c.foo -> ["test",2,3]
// a.foo -> ["test",2,3]
Run Code Online (Sandbox Code Playgroud)
在尝试改变时,c.foo
我改变了a.foo
,c.foo
显示了改变,因为它继承了a
.我现在看到的唯一解决方案是仅修改以下的直接属性b
:
d = Object.create(a);
d.foo = Object.create(a.foo);
d.foo[0] = 'text'; …
Run Code Online (Sandbox Code Playgroud) 我到处搜索并发现类似的问题,答案并没有真正解决我的问题,所以我道歉,如果这似乎是重复,但从我的实验中看来,jQuery的深拷贝功能实际上并没有像它描述的那样工作(或也许我误读了它的描述).
这是一个展示我遇到的问题的例子:http: //jsfiddle.net/wcYsH/
或者这个下载:https: //github.com/kevroy314/jQuery-Extend-Test
为什么在操作深层副本时,前一个副本中的数据会发生变化?
你能告诉我如何在Javascript中解冻一个冻结的对象,以便我能够修改它的属性吗?
var pizza = {
name: 'Peri Peri',
Topping: 'Prawn'
};
Object.freeze(pizza);
// Can't change the name of the object because it's frozen
pizza.name = 'Hawaiian';
Run Code Online (Sandbox Code Playgroud) 当我正在开发一个项目时,我遇到了这段代码:
var params = JSON.parse(JSON.stringify(defaultParams));
Run Code Online (Sandbox Code Playgroud)
这段代码实际上做了什么吗?
在减速器中,我们总是Object.assign({},state,newState)
用来保存状态.但是assign()
不支持deepcopy,因为这种方法只复制多级对象的引用.这是我在程序中的代码.
const menuListState={
menuList: {},
menuListLoading:false
}
function getMenuList(state=menuListState,action=defaultAction){
switch(action.type){
//menuList begin
case actions.GET_MENULIST_SUCCESS:
return Object.assign({},state,{
menuList:action.data,
menuListLoading:false
});
default:
return state;
}
}
Run Code Online (Sandbox Code Playgroud)
该属性menuList
是一个多级对象.而当action.data
改变时,会state.menuList
在方法assign()
工作之前立即改变吗?
我试图以纯粹的功能方式创建循环算法(https://en.wikipedia.org/wiki/Round-robin_scheduling).
该函数应该接收如下数组:
[
[ 1, 2 ],
[ 3, 4 ]
]
Run Code Online (Sandbox Code Playgroud)
并产生以下输出:
[ 1, 3, 2, 4 ]
为实现这一目标,我决定以递归方式实现循环,如下所示:
const roundRobin = (arr, results) => {
if (arr.length === 0) return results;
const newResults = arr.reduce((acc, current) => {
if (current.length > 0) {
acc.results.push(current.shift());
acc.arr.push(current);
}
return acc;
}, { arr: [], results });
return roundRobin(newResults.arr, newResults.results);
};
Run Code Online (Sandbox Code Playgroud)
在这里,我感觉到一系列结果,当我没有任何东西可以添加时,我就完成了.可以使用以下代码:
const array = [
[ 1, 2 ],
[ 3, 4 ]
];
const result …
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚React Hook API的工作方式。我正在尝试将数字添加到列表中。我评论的代码,即myArray.push ...似乎没有执行该操作,尽管它下面的代码可以正常工作。为什么会这样呢?
import React, {useState} from 'react'
export default () => {
const [myArray, setArray] = useState([1,2,3])
return (
<div>
{myArray.map((item=>{
return <li>{item}</li>
}))}
<button onClick = {()=>{
// myArray.push(myArray[myArray.length-1]+1)
// setArray(myArray)
setArray([...myArray, myArray[myArray.length-1]+1])
}}>Add</button>
</div>
)
}
Run Code Online (Sandbox Code Playgroud) javascript ×9
object ×3
clone ×2
reactjs ×2
deep-copy ×1
extend ×1
inheritance ×1
jquery ×1
json ×1
react-hooks ×1
redux ×1
vue.js ×1