我在这里编写了一个快速的jsfiddle ,我将一个小的json对象传递给一个新的变量并修改原始变量(而不是新变量)的数据,但新变量的数据也会更新.这必须意味着json对象是通过引用传递的,对吧?
这是我的快速代码:
var json_original = {one:'one', two:'two'}
var json_new = json_original;
console.log(json_original); //one, two
console.log(json_new); //one, two
json_original.one = 'two';
json_original.two = 'one';
console.log(json_original); //two, one
console.log(json_new); //two, one
Run Code Online (Sandbox Code Playgroud)
有没有办法制作json对象的深层副本,以便修改原始变量不会修改新变量?
我四处寻找如何使用该Object.defineProperty方法,但找不到任何体面的东西.
有人给了我这段代码:
Object.defineProperty(player, "health", {
get: function () {
return 10 + ( player.level * 15 );
}
})
Run Code Online (Sandbox Code Playgroud)
但我不明白.主要get是,我不能得到(双关语).它是如何工作的?
我有一个超类是父(Entity)对于很多子类(Customer,Product,ProductCategory...)
我正在寻找动态克隆在Typescript中包含不同子对象的对象.
例如:a Customer有不同的Product人有ProductCategory
var cust:Customer = new Customer ();
cust.name = "someName";
cust.products.push(new Product(someId1));
cust.products.push(new Product(someId2));
Run Code Online (Sandbox Code Playgroud)
为了克隆整个对象树,我创建了一个函数 Entity
public clone():any {
var cloneObj = new this.constructor();
for (var attribut in this) {
if(typeof this[attribut] === "object"){
cloneObj[attribut] = this.clone();
} else {
cloneObj[attribut] = this[attribut];
}
}
return cloneObj;
}
Run Code Online (Sandbox Code Playgroud)
在new上升时,它被transpiled为JavaScript以下错误:error TS2351: Cannot use 'new' with an expression whose type lacks a call or …
我有一个关于模块缓存的node.js文档的问题:
模块在第一次加载后进行缓存.这意味着(除其他外)每次调用require('foo')将获得 完全相同的返回对象,如果它将解析为同一个文件.
多次调用require('foo')可能不会导致模块代码多次执行.这是一个重要的特征.有了它,就可以返回"部分完成"的对象,从而允许加载传递依赖,即使它们会导致循环.
是什么意思may?
我想知道require是否总是返回相同的对象.所以,如果我需要一个模块一个中app.js,改变出口中的对象app.js(需要回报的),之后需要一个模块乙在app.js本身需要模块一个,我将永远得到该对象的修改版本或新一?
// app.js
var a = require('./a');
a.b = 2;
console.log(a.b); //2
var b = require('./b');
console.log(b.b); //2
// a.js
exports.a = 1;
// b.js
module.exports = require('./a');
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的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中是否有一种方法可以使用扩展语法来深度复制对象?
我有一个变量,它有一个JSON对象作为其值.我直接将此变量分配给其他变量,以便它们共享相同的值.这是它的工作原理:
var a = $('#some_hidden_var').val(),
b = a;
Run Code Online (Sandbox Code Playgroud)
这有效,两者都有相同的价值.我使用mousemove事件处理程序来更新b我的应用程序.单击按钮,我想恢复b原始值,即存储的值a.
$('#revert').on('click', function(e){
b = a;
});
Run Code Online (Sandbox Code Playgroud)
在此之后,如果我使用相同的mousemove事件处理程序,它会同时更新两者,a并且b在更早时它仅b按预期更新.
我很难过这个问题!这有什么不对?
所以我想将道具传递给Vue组件,但我希望这些道具将来会从该组件内部改变,例如当我使用AJAX从内部更新该Vue组件时.所以它们只用于组件的初始化.
我的cars-listVue组件元素,我将具有初始属性的props传递给single-car:
// cars-list.vue
<script>
export default {
data: function() {
return {
cars: [
{
color: 'red',
maxSpeed: 200,
},
{
color: 'blue',
maxSpeed: 195,
},
]
}
},
}
</script>
<template>
<div>
<template v-for="car in cars">
<single-car :initial-properties="car"></single-car>
</template>
</div>
</template>
Run Code Online (Sandbox Code Playgroud)
我现在这样做的方式是在我的single-car组件里面我分配 this.initialProperties给我this.data.properties的created()初始化钩子.它起作用并且具有反应性.
// single-car.vue
<script>
export default {
data: function() {
return {
properties: {},
}
},
created: function(){
this.data.properties = this.initialProperties;
},
}
</script>
<template> …Run Code Online (Sandbox Code Playgroud) 如何使用ES6克隆Javascript类实例.
我对基于jquery或$ extend的解决方案不感兴趣.
我已经看到对对象克隆的相当古老的讨论表明这个问题非常复杂,但是使用ES6可以得到一个非常简单的解决方案 - 我会把它放在下面,看看人们是否认为它是令人满意的.
编辑:建议我的问题是重复的; 我看到了这个答案,但它已经有7年的历史,并且使用前ES6 js涉及非常复杂的答案.我建议我的问题,允许ES6,有一个非常简单的解决方案.
是否可以将对象存储在React组件的状态中?如果是,那么我们如何使用setState?更改该对象中键的值?我认为在语法上不允许写下这样的东西:
this.setState({ abc.xyz: 'new value' });
Run Code Online (Sandbox Code Playgroud)
在类似的方面,我还有另一个问题:在React组件中有一组变量是否可以在组件的任何方法中使用它们,而不是将它们存储在一个状态中?
您可以创建一个包含所有这些变量的简单对象,并将其放置在组件级别,就像在组件上声明任何方法一样.
它很可能遇到这样的情况,即在代码中包含大量业务逻辑,并且需要使用许多变量,这些变量的值由多个方法更改,然后根据这些值更改组件的状态.
因此,您只需保留那些值应直接反映在UI中的变量,而不是将所有这些变量保留在状态中.
如果这种方法比我在这里写的第一个问题更好,那么我不需要在状态中存储一个对象.
我有一个输入的对象数组.让我们来称呼它content.
尝试深度复制时,它仍然具有对前一个数组的引用.
我需要复制该输入数组,并更改重复部分的一个属性.
很久以来我尝试了不成功的不同方法.
ES6方式:
public duplicateArray() {
arr = [...this.content]
arr.map((x) => {x.status = DEFAULT});
return this.content.concat(arr);
}
Run Code Online (Sandbox Code Playgroud)
该slice方式:
public duplicateArray() {
arr = this.content.slice(0);
arr.map((x) => {x.status = DEFAULT});
return this.content.concat(arr);
}
Run Code Online (Sandbox Code Playgroud)
在这两个数组中,所有对象都有status: 'Default'.
在Angular 2中深度复制数组的最佳方法是什么?
javascript ×9
ecmascript-6 ×2
node.js ×2
object ×2
typescript ×2
angular ×1
es6-class ×1
jquery ×1
reactjs ×1
redux ×1
vue.js ×1