【问题标题】:How to add a property at the beginning of an object in javascript如何在javascript中的对象开头添加属性
【发布时间】:2013-10-27 18:00:27
【问题描述】:

我有

var obj = {'b': 2, 'c': 3};

我想在该对象的开头(而不是结尾)添加一个属性:

var obj = {'a': 1, 'b': 2, 'c': 3};

有没有一种干净的方法可以做到这一点?

【问题讨论】:

标签: javascript object


【解决方案1】:

你也可以在 ES6 (ES2015+) 中使用Object.assign()

let obj = {'b': 2, 'c': 3};
const returnedTarget = Object.assign({a: 1}, obj);

// Object {a: 1, b: 2, c: 3}

【讨论】:

  • 此方法不改变原对象,需提供新对象
  • 正确@MadaAryakusumah,这将返回一个新对象,其属性添加到开头。
  • 这仅在键是字符串类型时才有效。如果键的类型为 Number 并且您尝试添加字符串键,那么它将始终添加在末尾,即 obj = {"1" : "test1","2" : "test2"} 和 Object.assign({" key1": "value1"}, obj) 将返回 {"1" : "test1","2" : "test2","key1": "value1"} 它不会把新的键放在开头。跨度>
【解决方案2】:

现在你可以在 ES6 (ES2015+) 中使用很酷的扩展运算符 (...),试试以下方法:

const obj = {'b': 2, 'c': 3};
   
const startAdded = {'a':1 , ...obj};
console.log(startAdded);

const endAdded = {...obj, 'd':4};
console.log(endAdded);

可能会帮助野外的人:)

【讨论】:

    【解决方案3】:

    最简单的方法是使用扩展运算符。

    let obj = {'b': 2, 'c': 3};
    let newObj = {'a': 1, ...obj};
    

    【讨论】:

      【解决方案4】:

      JavaScript 对象是无序的。没有开始或结束。如果要排序,请使用数组。

      var arr = [
          { key: 'b', value: 2 },
          { key: 'c', value: 3 }
      ];
      

      然后您可以在其前面添加unshift

      arr.unshift({ key: 'a', value: 1 });
      

      【讨论】:

      • 我需要使用 c 作为数组的键来访问 obj['c'] 。据我所知,js数组不允许你设置任意键,这就是我被卡住的原因。
      • 你最好维护一个对象和数组,它们都包含相同的对象。一种是按顺序排列,另一种是按字母索引。
      【解决方案5】:

      这可以使用lodash 合并函数来完成,如下所示:

      var myObj = _.merge({ col1: 'col 1', col2: 'col 2'}, { col3: 'col 3', col4: 'col 4' });
      

      您的最终对象将如下所示:

      { col1: 'col 1', col2: 'col 2', col3: 'col 3', col4: 'col 4' }
      

      正如其他人所提到的,不能保证对象中键的顺序会保持不变,具体取决于您对它的处理。但是,如果您将合并作为最后一步,您应该没问题。请注意,“合并”函数将生成一个全新的对象,它不会改变您传入其中的任何一个对象。

      【讨论】:

        【解决方案6】:
        var obj = {'b': 2, 'c': 3};
        obj = Object.assign({a: 1}, obj);
        console.log(obj); // {a: 1, b: 2, c: 3}
        

        希望对你有帮助

        【讨论】:

          【解决方案7】:

          Javascript 可能不会在语言本身中指定属性的顺序,但至少在我的项目(也许还有你的项目)中,它确实表现得好像确实如此(JSON.stringify,调试监视窗口等)。除了最初添加属性的顺序之外,我从未见过for...in 顺序。因此,就我项目的所有意图和目的而言,也许还有你的项目,这是非常可预测的。

          虽然这不会影响执行,但如果您想看到一个统一的列表,当不同项目的属性可能以不同的顺序添加时,这会很痛苦,具体取决于对象的创建方式。执行可能不是项目开发中唯一重要的事情。快速目视检查对象的能力也可能很重要。

          方法一(高科技)

          如果你有spread,如果你不介意另一个对象,我会使用它。但如果您没有spread(就像在旧的 google 应用程序脚本中一样),或者您需要保留原始对象,您可以这样做:

          objects.js

          // Insert Property
          Object.defineProperty(
            Object.prototype, 
            'insertProperty', 
            {
            value: function(name, value, index){
              // backup my properties
              var backup = {};
              // delete all properties after index
              var propertyIndex = 0;
              for(var propertyName in this) {
                if(this.hasOwnProperty(propertyName) && propertyIndex++ >= index) {
                  backup[propertyName] = this[propertyName];  
                  delete this[propertyName];
                }
              }
              this[name] = value;
              // restore all properties after index
              for(var propertyName in backup) {
                if(backup.hasOwnProperty(propertyName))
                  this[propertyName] = backup[propertyName];  
              }
              return this; // same object; not a new object
            },
            enumerable: false,
          });
          

          用法

            var obj = {'b': 2, 'c': 3};
            obj.insertProperty('a',1,0); // {a:1, b:2, c:3}
          

          笔记

          • 您可以使用任何index 将属性放在您想要的任何位置。 0 放在前面。
          • 如果您不喜欢向object prototype 添加方法,您当然可以将函数拉出并添加一个obj 参数。在我的项目中,向原型添加方法对我有帮助;它不会伤害我。

          方法 2(低技术)

          在某些情况下,您可以只使用您知道它最终可能具有的所有属性以您希望它们出现的顺序创建您的对象,然后,而不是插入属性,只需设置属性。

          // creation
          var a = {Id: null, foo: 'bar'}; 
          
          // update later
          if(!a.Id)
            a.Id = '123'; 
          

          【讨论】:

            【解决方案8】:

            对我有用的是使用临时对象以所需的顺序存储项目。 例如:

            var new_object = {}; 
            new_object[name] = value; // The property we need at the start 
            
            for (var key in old_object) { // Looping through all values of the old object 
              new_object[key] = old_object[key];
              delete old_object[key]; 
            } 
            
            old_object = new_object; // Replacing the old object with the desired one
            

            【讨论】:

            • 对象没有顺序,for in任意枚举。
            • 但是......它没有。
            猜你喜欢
            • 2012-05-28
            • 2022-07-21
            • 1970-01-01
            • 2014-08-26
            • 2016-12-30
            • 2022-07-21
            • 2015-11-15
            • 2014-05-29
            • 2021-10-23
            相关资源
            最近更新 更多