Javascript同步对象与数组

Javascript sync object with an array

本文关键字:数组 对象 同步 Javascript      更新时间:2023-09-26

我有一个对象:

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. 每当对象改变时,我通过根据对象中键的值对数组中的键执行push/remove操作来操作相同的arr。(在我的例子中,使用angularjs可以很容易地检测到对象的更新)

  2. 每当对象改变时,我将用只包含在

  3. 中值被设置为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。但是它更不容易出错。

所以如果你在一个对象中条目较少(比如50100可能),那么替换数组(构建新数组)应该会更好。

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

你提到你正在使用角,这可能会帮助你直接如果你正在寻找代码解决方案。

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

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