Javascript同步对象与数组

时间:2013-06-21 07:15:42

标签: javascript

我有一个对象:

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'];

我想到了两个解决方案:

  1. 每当对象发生变化时,我都会根据对象中键的值对数组中的该键执行推/删操作来操作相同的arr。 (在我的例子中,可以使用angularjs轻松检测到对象的更新)

  2. 每当对象发生变化时,我都会用新数组替换旧数组,该数组只包含其值设置为true的键。

  3. 哪种解决方案更好?

5 个答案:

答案 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)

Live demo:

你可以使用一个简单的类:

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个元素。但只有一个是   改变。所以它只会执行一个元素。

     

在第二种情况下,它将检查所有元素,即耗时   和处理。