我需要以某种方式深度克隆我的ScriptEngine对象的整个绑定集.
到目前为止,我已经尝试过Cloner库来克隆整个Bindings结构.如果它有用,那将是很好的,因为它可以确保精确的副本,包括私有变量.但这会导致jvm堆损坏(jvm只是崩溃,退出代码为-1073740940).有时它不会崩溃,但会发生奇怪的事情,比如System.out.println()停止工作应该......
我还研究了使用ScriptEngine中的js代码克隆对象,这样我就可以将它们作为NativeObjects获取并在一些java地图中管理它们.但是我发现的所有克隆方法都存在缺陷.我想要一个精确的对象快照.例如,如果每两个对象A和B的包含字段(比如a.fa和b.fb),其引用相同的对象C,使用克隆时jQuery.extend()(例如)的字段a.fa和b.fb克隆的a和b的将引用的不同的克隆c,而不是引用一个相同的克隆.还有许多其他边缘问题.
我还尝试使用Cloner克隆整个ScriptEngine(不仅仅是绑定),我还尝试使用Rhino的js引擎并克隆整个范围(而不是Bundeled ScriptEngine包装器).但堆腐败问题仍然存在.
我需要这个,因为我必须能够将整个ScriptEngine绑定的值恢复到之前的某个点.我需要制作绑定的精确快照.
该应用程序是我的博士研究项目的一部分,该项目包括运行状态机和节点(在java中实现),其中附带了js代码.js代码由最终用户输入,并且在运行时被逐出.当无法通过路径到达最终状态时,算法会向后退步,尝试查找备用路径.在每个步骤向后,它必须撤消js引擎绑定中可能发生的任何更改.
所有全局变量名称在js evaling之前都是已知的,并且是对象(用户在节点的代码中键入,然后将其组织(在java中)到具有某些名称模式的js对象中).但是他们的内容可以是任何东西,因为它是由用户js代码控制的.
所以我想我现在唯一的解决方法是使用js代码克隆js对象.
我使用以下脚本获取前一周的周一(第一个)和周日(最后一个):
var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay() - 6; // Gets day of the month (e.g. 21) - the day of the week (e.g. wednesday = 3) = Sunday (18th) - 6
var last = first + 6; // last day is the first day + 6
var startDate = new Date(curr.setDate(first));
var endDate = new Date(curr.setDate(last));
Run Code Online (Sandbox Code Playgroud)
如果上个星期一和星期天也在同一个月,这个工作正常,但我今天才注意到,如果今天是12月,而上个星期一是11月,它就不起作用.
我是JS的新手,还有另外一种方法可以获得这些日期吗?
为什么这不起作用?
var sheep = function(options){
this.options = {sizes: 100,
eat: 100,
colors: 'white',
running: function () {
return this.sizes + this.eat;
}
}
};
var blacksheep = new sheep({colors:'black'});
alert('blackcsheep color is ' + blacksheep.colors);//error undefined
alert('blackcsheep color is ' + blacksheep.options.colors);// it return white
alert('blackcsheep running is ' + blacksheep.running());//error
Run Code Online (Sandbox Code Playgroud) 我有查询对象
var q = {
age: 10,
'profile.contry': 'india'
};
Run Code Online (Sandbox Code Playgroud)
现在我复制q变量并从重复变量中删除键.
var duplicateQ = q;
delete duplicateQ['profile.contry']; // I have removed 'profile.country' from duplicateQ.
console.log(q); //Object { age: 10 }
console.log(duplicateQ); //Object { age: 10 }
Run Code Online (Sandbox Code Playgroud)
为什么两个变量都受到影响?我怎样才能从其中一个中删除该属性?
我有方法:
export const groupActivities = ({ activities, tags, images, tickets }) => {
if (!activities || !tags) {
console.error('Must have activities and tags');
}
const groupActivities = Object.assign({}, activities);
const groups = groupByTags({ activities: groupActivities, tags });
groups.forEach(group => {
group.length = group.activities.length;
console.log(group.length);
group.activities.forEach(activity => {
if (images) {
activity.images = activity.imageIds.map(id => images[id]);
}
if (tickets) {
console.warn('No tickets provided to the groupactivities helper. May cause problems.');
activity.tickets = activity.ticketIds.map(id => tickets[id]);
}
});
});
return groups;
}; …Run Code Online (Sandbox Code Playgroud) 假设我有这种数据......
data = [{
"_id" : "1",
"parentId" : "thisPostId",
"topLevelId" : "1",
"text" : "<p>comment</p>",
},
{
"_id" : "2",
"parentId" : "1",
"topLevelId" : "1",
"text" : "<p>reply to comment</p>",
},
{
"_id" : "3",
"parentId" : "2",
"topLevelId" : "1",
"text" : "<p>reply to reply to comment</p>",
},
{
"_id" : "4",
"parentId" : "3",
"topLevelId" : "1",
"text" : "<p>reply to reply to reply to comment</p>",
}]
Run Code Online (Sandbox Code Playgroud)
我需要删除评论及其所有孩子......
如果注释删除是_id:1,那么我需要一个数组["1","2","3","4"],,,然后我可以运行Coll.remove({_id:{$in:["1","2","3","4"]}}, callback);
如果注释要删除 …
例如,我有一个像这样的对象:
obj1 = {
name: 'Bob',
age: 20,
career: 'teacher'
}
Run Code Online (Sandbox Code Playgroud)
现在我需要复制其部分属性而不是所有属性.
obj2 = {
name: '',
age: '',
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做obj2.name = obj1.name,如果需要复制许多属性,这将是冗长的.还有其他快速方法可以解决这个问题吗?我试过了
let {name: obj2.name, age: obj2.age} = obj1;
但是得到了错误.
我有一个myVariable不断变化的变量。在某些时候,我想捕捉的值的myVariable(不是引用到myVariable)到另一个变量myVariableAtSomePoint。
示例代码:
var myVariable = 1;
function test () {
var myVariableAtSomePoint= myVariable;
console.log(myVariableAtSomePoint);
}
myVariable = 2;
test(); // Prints 2, instead of 1.
Run Code Online (Sandbox Code Playgroud) 注意:我只是一个新手程序员,所以这个问题的核心可能是明显的错误或误解。
本质上,我需要将JavaScript中的“按值”多维数组深度复制到未知深度。我认为这将需要一些复杂的递归,但是似乎在JavaScript中,您只需要复制一个级别就可以按值复制整个数组。
举个例子,这是我的测试代码,它使用了一个故意卷积的数组。
function test() {
var arr = [ ['ok1'],[],[ [],[],[ [], [ [ ['ok2'], [] ] ] ] ] ];
var cloned = cloneArray(arr);
arr = ''; // Delete the original
alert ( cloned );
}
function cloneArray(arr) {
// Deep copy arrays. Going one level deep seems to be enough.
var clone = [];
for (i=0; i<arr.length; i++) {
clone.push( arr[i].slice(0) )
}
return clone;
}
Run Code Online (Sandbox Code Playgroud)
在我运行此测试(Ubuntu上最新稳定的Chrome和Firefox)的过程中,即使删除了原始数组,即使数组最深的部分也似乎已成功通过克隆中的值成功复制,即使slice_()复制”仅深入了一层。这是JavaScript中的标准行为吗?我可以依靠它来运行较旧的浏览器吗?
我正在研究d3js和分层布局的数据可视化.我的数据如下:
0
/ | \
/ | \
1 5 3
\ | |
\ | |
4 /
| /
2
Run Code Online (Sandbox Code Playgroud)
因为我无法链接到多个父节点,所以我复制了显示的节点:
0
/ | \
/ | \
1 5 3
| | |
| | |
4 4 |
| | |
2 2 2
Run Code Online (Sandbox Code Playgroud)
我做了一个小提琴演示来展示我的问题:
这是我用来解析输入的循环:
for (i in root[2].Arcs){
var d = root[1].Nodes[root[2].Arcs[i].D];
var s = root[1].Nodes[root[2].Arcs[i].S];
if (!d.children){
d.children = [];
}
d.children.push(s);
}
Run Code Online (Sandbox Code Playgroud)
对我来说:控制台中的两个打印元素都是相同的,但不是布局的渲染.对象引用中可能存在一些不同之处.
我发现一个糟糕的解决方案是解码然后编码我的var:
var root …Run Code Online (Sandbox Code Playgroud) javascript ×10
arrays ×2
babeljs ×1
clone ×1
d3.js ×1
ecmascript-6 ×1
java ×1
jquery ×1
json ×1
lodash ×1
rhino ×1
scriptengine ×1