【问题标题】:How to add new property with same key name inside declared object?如何在声明的对象中添加具有相同键名的新属性?
【发布时间】:2014-10-19 20:41:41
【问题描述】:

如何在声明的对象中附加/添加具有相同键名的新属性?

代码如下:

// Declared object
var myObject = {
    name : 'John',
    age  : 15,
};

// Array list of new property need to be add to myObject
var others = [
  { key : 'hobby', value: 'reading' },
  { key : 'hobby', value: 'writing' }
];

到目前为止我一直在尝试:

ko.utils.arrayForEach(others, function(other) {
    myObject[other.key] = other.value;
});

ko.utils.arrayForEach(others, function(other) {
    var extendObject = new Object();
    extendObject[other.key] = other.value;

    $.extend(myObject, extendObject);
});

结果仍然两者都不起作用。它只是替换现有的属性值

我需要的是这样的:

myObject: { name: 'John', age: 15, hobby: 'reading', hobby: 'writing' }

请注意:我不想让它成为数组:hobby: ['reading', 'writing']

更新:

我是为搜索功能实现的,上面的代码和细节是我被卡住的部分的简化版本。

这是我尝试完成的完整代码:

我的观点:

<form data-bind="submit: $root.getSearchData">
  <input name="date_start" class="datepicker">

  <div class="checkbox">
    <label>
       <input type="checkbox" name="user_id[]" value="1"> John
    </label>
    <label>
       <input type="checkbox" name="user_id[]" value="2"> Michael
    </label>
  </div>
</form>

我的视图模型:

// Will contains new search property need to append to queryData
self.searchPropertyList = ko.observableArray();

// This function will fetch tasks from server
self.getTasksFromServer = function()
{
   // Query data
   var queryData = {
       sort : 'start',
       order: 'asc'
   };

   /**
    * When getSearchData function fill formData into searchPropertyList observable,
    * this function will get a notify and it will automatically loop through it 
    * and append new property to queryData.
    */
   ko.utils.arrayForEach(self.searchPropertyList(), function(opt)
   {
       queryData[opt.name] = opt.value;
   }

   $.ajax({
       url: 'api/tasks',
       type: 'json',
       data: queryData,
       success: function(data)
       {
       }
   });
}

// Returned form property as array into searchPropertyList observableArray 
// and notify getTaskFromServer function
// This is how formData may look like
// formData = [{ name: 'date_start', value: '2014-08-26' }, { name: 'user_id[]', value: 1 }, { name: 'user_id[]', value: 2 }]; 
self.getSearchData = function(form)
{
     var formData = $(form).serializeArray();

     self.searchPropertyList(formData);
}

所以,ajax 会请求这样的东西:

api/tasks?sort=start&order=asc&date_start=2014-08-26&user_id[]=1&user_id[]=2

有人,请帮忙,谢谢:)

【问题讨论】:

  • { key : 'hobby', value: 'reading writing' } nad 在阅读时将字符串拆分为 " " 以获取爱好的数组。不太确定你是否可以有 2 个属性同一个名称。
  • 一个对象中不能有多个同名的属性。
  • 一个对象中永远不会有两个同名的属性。数组似乎是你的救星
  • 还有其他方法可以做到这一点吗?
  • 是的,有一种方法:你需要使用一个数组。但是你的最终目标是什么?为什么数组不是你的解决方案?

标签: javascript jquery knockout.js javascript-objects


【解决方案1】:

正如 cmets 所说,您不能拥有多个同名的属性。

您可以这样做将爱好值添加到同一个爱好属性中,并在您需要所有爱好时将其拆分:

var person = { hobby: "programmer" };

// adding another hobby
person.hobby =+ "-secretary";

var hobbies = person.hobby.split("-"); // [programmer,secretary]

【讨论】:

  • 嗨@Misters,感谢您的回答!我已经更新了我的问题,你可以看看吗?
【解决方案2】:

复制的

How can I store multiple values per key in a hash table using Node.JS?

你必须使用 {key, [array]} 这是一个以数组为值的 hashmap 并编写自定义方法来推送和弹出。

【讨论】:

  • 如前所述,我不需要将值作为数组。顺便说一句,谢谢你的回答,你能看看我更新的问题吗?也许您还有其他想法可以帮助我完成它?
  • 您在寻找 knockoutjs 绑定复选框的解决方案吗? stackoverflow.com/questions/18062306/… 避免在名称中使用 []。这不是一个好习惯。
  • 不,我不需要复选框直接绑定到 observable,它会自动触发我的 getTasksFromServer 函数,无需用户手动(单击)提交表单。
【解决方案3】:

不能在对象内添加/附加相同的键,但您可以添加和额外的键,例如下面的代码。通过这样做,您可以区分相同的键

// Declared object
var myObject = {
    name : 'John',
    age  : 15,
};

// Array list of new property need to be add to myObject
var others = [
  {0 : { key : 'hobby', value: 'reading' }},
  {1 :{ key : 'hobby', value: 'writing' }}
];

【讨论】:

  • 嗨,谢谢你的回答,你能看看我更新的问题吗?也许你会有其他想法来帮助我实现这一目标?
  • 嗨 Fariz Azmi,您永远不会将相同的键/值添加/附加到任何对象中。我认为我已经对您执行了上述解决方案。会帮助你。因为几天前,我遇到了您现在面临的同样问题。我尝试了该代码,它帮助了我。
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多