我想知道是否有一种快速方法可以将关联数组的键提取到数组中,或者使用JavaScript提取逗号分隔列表(jQuery没问题).
options = {key1: "value1", key2: "value2"};
Run Code Online (Sandbox Code Playgroud)
结果应该是数组:
["key1", "key2"]
Run Code Online (Sandbox Code Playgroud)
或只是一个字符串:
"key1, key2"
Run Code Online (Sandbox Code Playgroud) 可能重复:
对象文字声明中的自引用
有没有办法在同一个对象文字中访问属性名称的值?像这样的东西:
myFunction.init({
varOne: 'something',
varTwo: this.varOne + 'something else'
})
Run Code Online (Sandbox Code Playgroud) 我有一些嵌套的对象数据,我想搜索它并根据id返回匹配的对象.
var data = [{id: 0, name: 'Template 0', subComponents:[
{id: 1, name: 'Template 1', subItems:[
{id: 2, name: 'Template 2', subComponents:[{id: 3, name: 'Template 3'}], subItems: [{id: 4, name: 'Template 4'}]}
]}
]}
];
Run Code Online (Sandbox Code Playgroud)
所以我想做这样的事情
getObjectByKeyValue({id: 3})
Run Code Online (Sandbox Code Playgroud)
并让它回来
{id: 3, name: 'Template 3'}
Run Code Online (Sandbox Code Playgroud)
它有点必须完成,因为我有subItems,AND子组件,每个子组件都可以有孩子.
我尝试使用Prototype 1.7并没有运气 - 我认为这只是搜索一个数组,而不是一个带有它的子节点的树:
data.find(function(s){return s.id == 4;})
Run Code Online (Sandbox Code Playgroud)
提前致谢!!!!!!
考虑这个伪代码:
(function(window){
var options = { /*where everything goes */ };
var instance = (function(options){
for (var i in options){
if (options.hasOwnProperty(i)){
this[i] = options[i];
}
}
})(options);
instance.callbacks = function(cb){
//...
}
instance.is_allowed = function()
//... checks, return boolean
}
window.instance = instance;
})(this);
Run Code Online (Sandbox Code Playgroud)
如果有人想操纵这个代码(例如恶意用户),他会is_allowed用自己的代码重写函数,例如,使用地址栏(他没有萤火虫,谁知道).
javascript:(function(){ window.instance.is_allowed = function(){ return true; } })();
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子,但重点是,Javascript中的任何内容都可以被覆盖.
我知道在es5中我们有Object.defineProperty,所以你可以设置:
// being explicit
Object.defineProperty(instance, "is_allowed", {
enumerable: false,
configurable: false,
writable: false,
value: function(){
// do checks
}
});
Run Code Online (Sandbox Code Playgroud)
实际上,在这个意义上最好的是使用Object.freeze(instance)或 …
据我所知,在JavaScript中,每个对象都有一个prototype,它暴露了一些默认属性.我有以下代码,我试图通过设置两个对象的Year属性prototype.但这两个电话都失败了.
toLocalString()如果我没有访问权限,如何覆盖任何对象prototype?请注意,以下代码用于测试prototype属性,但我的目的是覆盖该toLocalString()方法.
var car = {
Make: 'Nissan',
Model: 'Altima'
};
car.Year = 2014;
alert(car.Year);
alert(car.prototype); // returns undefined
car.prototype.Year = 2014; // Javascript error
// --------------
function Car() {
this.Make = 'NISSAN';
this.Model = 'Atlanta';
}
var v = new Car();
v.prototype.Year = 2014; // JavaScript error
alert(v.prototype);
Run Code Online (Sandbox Code Playgroud) 以下内容将在Firebug或jsconsole.com或其他Javascript交互式控制台中显示:
>>> foo = { a : 1, b : 2.2 }
Object { a=1, more...}
>>> foo.a
1
>>> foo.b
2.2
>>> { a : 1, b : 2.2 }
SyntaxError: invalid label { message="invalid label", more...}
>>> { a : 1 }
1
Run Code Online (Sandbox Code Playgroud)
为什么是1返回{a : 1}以及为何{a : 1, b : 2.2}给了一个错误?在Ruby中,它们会以您定义它的方式返回.
我正在尝试定义一个对象并为其创建一个访问器属性.
HTML:
<input type='hidden' id='crudMode' value='Create' />
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
crudMode = {
create: "Create",
read: "Read",
update: "Update",
delete: "Delete",
current: function () { return $('#crudMode').val(); }
}
Object.defineProperty(crudMode, 'mode', {
get: function(){
return this.current();
},
set: function(value){
$('#crudMode').val(value);
}
});
Run Code Online (Sandbox Code Playgroud)
但是当我使用它时,它会在问题标题中引发提到的错误:
console.log(crudMode.mode);
Run Code Online (Sandbox Code Playgroud)
抛出:
TypeError:无法重新定义不可配置的属性"mode"
这有什么不对?
我在自动生成的javascript文件中看到了这个:
function map(x){
x={x:x};
delete x.x;
return x
}
Run Code Online (Sandbox Code Playgroud)
我的结论是用于创建一个对象,但为什么要以这种方式创建它?这是一种模式吗?
UPDATE
更多信息,创建此代码的工具是来自Google的dart2js,代码用于此上下文:
(function (reflectionData) {
function map(x){x={x:x};delete x.x;return x}
if (!init.libraries) init.libraries = [];
if (!init.mangledNames) init.mangledNames = map();
if (!init.mangledGlobalNames) init.mangledGlobalNames = map();
if (!init.statics) init.statics = map();
if (!init.interfaces) init.interfaces = map();
Run Code Online (Sandbox Code Playgroud) 我有两个与我深深比较的对象阵列 lodash
但是,我有一个问题:
> var x = [{a:1, b:2}, {c:3, d:4}];
> var y = [{b:2, a:1}, {d:4, c:3}];
> _.difference(x,y, _.isEqual);
[ { a: 1, b: 2 }, { c: 3, d: 4 } ]
Run Code Online (Sandbox Code Playgroud)
我应该如何比较看两者是否相等?
我有两个JavaScript数组orig(原始对象数组)和update(更新的对象的orig数组),它们具有相同的长度并包含对象,我想输出每对对象之间的差异.
例:
var orig = [{enabled:"true", name:"Obj1", id:3},{enabled:"true", name:"Obj2", id:4}];
var update = [{enabled:"true", name:"Obj1", id:3}, {enabled:"true", name:"Obj2-updated", id:4}];
Run Code Online (Sandbox Code Playgroud)
输出应该是: name:"Obj2-updated"
我实现了一些东西,但它需要优化......
for(var prop=0; prop<orig.length; prop++) {
for(prop=0; prop<update.length; prop++) {
if(orig[prop].enabled != update.enabled) { console.log(update.enabled) }
if(orig[prop].name != update[prop].name) { console.log(update[prop].name) }
if(orig[prop].id != update[prop].id) { console.log(update[prop].id) }
}
}
Run Code Online (Sandbox Code Playgroud) javascript arrays data-manipulation javascript-objects difference
javascript ×10
arrays ×3
prototype ×2
difference ×1
firebug ×1
jquery ×1
lodash ×1
overwrite ×1
properties ×1
recursion ×1
singleton ×1
tree ×1