我有一个对象:
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'];
我想到了两个解决方案:
每当对象发生变化时,我都会根据对象中键的值对数组中的该键执行推/删操作来操作相同的arr。 (在我的例子中,可以使用angularjs轻松检测到对象的更新)
每当对象发生变化时,我都会用新数组替换旧数组,该数组只包含其值设置为true
的键。
哪种解决方案更好?
答案 0 :(得分:2)
我认为管理外部阵列不是一个实用的解决方案。您要搜索的数组表示对象的状态。所以我建议在对象中添加一个方法,根据它们的值动态返回一个属性数组:
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);
答案 1 :(得分:2)
你可以使用一个简单的类:
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_);
};
答案 2 :(得分:1)
这取决于一些事情。
您在一个对象中拥有多少对,或者您有多少这样的对象。
您能简单描述一下您的用例吗?
首先,当你依赖GC
时,内存效率会降低。但它不易出错。
所以如果你在一个对象中有更少的项(比如 50 或 100 )而不是替换数组(构建新的数组) )应该更好。
>
您提到您正在使用角度,如果您正在寻找代码解决方案,这可能会立即帮助您。
$scope.$watch('obj', function (newVal, oldVal) {
$scope.selectedItems = $.map(newVal,function(k,v){
if(k === true)
return v;
});
},true);
答案 3 :(得分:0)
jQuery的map函数应该是你需要的。
var o = {'a':true,'b':false,'c':false,'d':true};
jQuery.map(o, function(val, idx){
if(val)
return idx;
});
如果一个Object发生了变化,你可以用这个替换旧的数组:我仍然认为这不是一个很好的解决方案..
答案 4 :(得分:0)
第一个更好。在这种情况下,您只需要删除其值已更改的那些。
e.g。我们在一个数组中有1000个元素。但只有一个是 改变。所以它只会执行一个元素。
在第二种情况下,它将检查所有元素,即耗时 和处理。