3

我有一个对象:

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. 每当对象更改时,我都会用新数组替换旧数组,新数组只包含值设置为 in 的那些键true

哪个解决方案更好?

4

5 回答 5

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);
于 2013-06-21T07:27:39.537 回答
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_);
};
于 2013-06-21T07:28:21.233 回答
1

好吧,这取决于几件事。

您在一个对象中有多少对或您有多少这样的对象。

你能简要描述一下你的用例吗?

第一个内存效率较低,因为您依赖GC. 但它不太容易出错。

因此,如果您在一个对象中的项目较少(比如50100 个),那么替换数组(构建新数组)应该会更好。

有时,不易出错的代码比内存效率低的代码要好

您提到您正在使用角度,如果您正在寻找代码解决方案,这可能会立即帮助您。

$scope.$watch('obj', function (newVal, oldVal) {
    $scope.selectedItems = $.map(newVal,function(k,v){
      if(k === true)
        return v;
    });
  },true);
于 2013-06-21T07:28:53.070 回答
0

第一个更好。在这种情况下,您只需删除值已更改的那些。

例如,我们在一个数组中有 100 万个元素。但只有一个改变了。所以它只会对一个元素执行。

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

于 2013-06-21T07:32:00.230 回答
0

jQuery的地图功能应该是你所需要的。

var o = {'a':true,'b':false,'c':false,'d':true};

jQuery.map(o, function(val, idx){
  if(val)
   return idx;
});

如果一个对象发生变化,你可以用这个替换旧数组:我仍然认为这不是一个很好的解决方案..

于 2013-06-21T07:24:29.960 回答