Immutable Hash and Array implementation in JavaScript?

前端 未结 4 916
南方客
南方客 2021-01-05 07:55

Is there simple immutable hash and array implementation in javascript? I don\'t need best speed, a reasonable speed better than a clone would be good.

相关标签:
4条回答
  • 2021-01-05 08:28

    The best way to clone an object in Javascript I'm aware of, is the one contained in underscore.js

    Shortly:

    _.clone = function(obj) {
      if (!_.isObject(obj)) return obj;
      return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
    };
    
    _.extend = function(obj) {
      each(slice.call(arguments, 1), function(source) {
        for (var prop in source) {
          obj[prop] = source[prop];
        }
      });
      return obj;
    };
    
    0 讨论(0)
  • 2021-01-05 08:29

    I know this question is old but I thought people that were searching like me should be pointed to Facebook's Immutable.js which offers many different types of immutable data structures in a very efficient way.

    0 讨论(0)
  • 2021-01-05 08:35

    I had the same requirements for persistent data structures for JS, so a while ago I made an implementation of a persistent map.. https://github.com/josef-jelinek/cofy/blob/master/lang/feat.js

    It contains implementation of a balanced tree based (sorted) map, and a naive copy-on-write map (and unfinished persistent vector/array).

    var map = FEAT.map();
    var map1 = map.assoc('key', 'value');
    var value = map1.get('key');
    var map2 = map1.dissoc('key');
    ...
    

    it supports other methods like count(), contains(key), keys(into = []), values(into = []), toObject(into = {}), toString()

    The implementation is not too complicated and it is in public domain. I accept suggestions and contributors too :).

    Update: you can find unit tests (examples of usage) at https://github.com/josef-jelinek/cofy/blob/master/tests/test-feat.html

    Update 2: Persistent vector implementation is now there as well with the following operations: count(), get(i), set(i, value), push(value), pop(), toArray(into = []), toString()

    0 讨论(0)
  • 2021-01-05 08:35

    The only way to make an object immutable is to hide it inside a function. You can then use the function to return either the default hash or an updated version, but you can't actually store an immutable hash in the global scope.

    function my_hash(delta) {
        var default = {mykey: myvalue};
        if (delta) {
            for (var key, value in delta) {
                if (default.hasOwnProperty(key)) default[key] = value;
            }
        }
        return default;
    }
    

    I don't think this is a good idea though.

    0 讨论(0)
提交回复
热议问题