Javascript同步对象与数组
Javascript sync object with an array
我有一个对象:
var obj = {'a':true,'b':false,'c':false,'d':true}
和我有一个同步数组,其中包含对象中值为true
的键。
var arr = ['a','d']
因此,如果obj
变为以下情况:(a
的值变为false
)
obj = {'a':false,'b':false,'c':false,'d':true}
那么arr
应该与以下内容同步:(a
元素从arr
中移除)
arr = ['d'];
我想到了两个解决办法:
每当对象改变时,我通过根据对象中键的值对数组中的键执行push/remove操作来操作相同的arr。(在我的例子中,使用angularjs可以很容易地检测到对象的更新)
每当对象改变时,我将用只包含在
中值被设置为
true
的键的新数组替换旧数组。哪个解决方案更好??
现场演示:
你可以使用一个简单的类:
function Pair(obj, arr) {
this.obj_ = obj || {};
this.arr_ = arr || [];
this.updateArray();
};
Pair.prototype.set = function(key, val) {
this.obj_[key] = val;
this.updateArray();
};
Pair.prototype.updateArray = function() {
this.arr_.length = 0;
for (var key in this.obj_) {
if (this.obj_.hasOwnProperty(key)) {
if (this.obj_[key] === true) {
this.arr_.push(key);
};
};
};
};
Pair.prototype.getArray = function() {
return JSON.stringify(this.arr_);
};
我不认为管理外部数组是一个实际的解决方案。您正在搜索的数组表示对象的状态。因此,我建议在对象中添加一个方法,根据其值动态返回一个属性数组:
var obj = {'a':true,'b':false,'c':false,'d':true};
obj.getPropertiesByState = function(state){
var res = [];
for (var key in this) {
if (this[key] === state) {
res.push(key);
}
}
return res;
}
var trueProperties = obj.getPropertiesByState (true);
这取决于几件事。
一个对象中有多少对,或者你有多少个这样的这样的对象
你能简要描述你的用例吗?
第一个内存效率较低,因为您依赖于GC
。但是它更不容易出错。
所以如果你在一个对象中条目较少(比如50或100可能),那么替换数组(构建新数组)应该会更好。
有时候,不容易出错的代码比内存效率低的代码要好。
你提到你正在使用角,这可能会帮助你直接如果你正在寻找代码解决方案。
$scope.$watch('obj', function (newVal, oldVal) {
$scope.selectedItems = $.map(newVal,function(k,v){
if(k === true)
return v;
});
},true);
jQuery的map函数应该是你需要的。
var o = {'a':true,'b':false,'c':false,'d':true};
jQuery.map(o, function(val, idx){
if(val)
return idx;
});
如果一个对象改变了,你可以用这个来替换旧的数组:但是我不认为这是一个很好的解决方案。
第一个更好。在这种情况下,您只需要删除那些值已更改的值。
。一个数组中有1000万个元素。但只有一个是改变了。所以它只对一个元素执行。
在第二种情况下,它将检查所有元素,即耗时和处理。
相关文章:
- 将数组对象传递到struts2中的操作类
- 如何使用jquery返回php-json数组对象
- 从其名称获取javascript数组对象
- 值未与数组对象绑定
- 如何按数组/对象值的倍数过滤对象数组
- 在表中显示数组对象
- 在数组对象中分组
- 将第二个或多个数组推送到数组对象 AngularJS 中
- 重新排列 JavaScript 数组/对象
- 键上的javascript数组对象过滤器
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 重建有角度的java脚本数组对象
- 对JSON数组对象进行排序
- 连接与数组对象相关的文本:方式和位置
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 如何使用Handlebars循环数组对象和模板
- 是否可以引用JS数组/对象中的另一个元素
- Javascript中的名称索引-数组/对象
- 数组长度不等于数组对象