淘汰JS:替换多维数组中的特定字段值

时间:2018-09-14 06:59:10

标签: javascript jquery knockout.js

我想替换多维数组中的特定字段值。我试图用替换功能替换它。

但是,语法结构可能存在问题。因此,我无法替换它。

当我检查我的可观察阵列时,该下方阵列显示在控制台中。

0 : {id: "1", title: "IT Manager", "description" : "description 1"}
1 : {id: "2", title: "Manager", "description" : "description 2"}

我想像在1个索引数组中一样动态地更改值,想从描述2 更改为描述3

在键盘上,我在下面调用此函数并获取当前的父数据:

changeQty : function(itemIndex){

                self.displayProductData.splice(4,self.displayProductData()[itemIndex.id], newQtyVal);

            },

该怎么做?

请帮助我。

1 个答案:

答案 0 :(得分:1)

如果尝试替换可观察数组中对象的特定属性,则该属性将不起作用,因为这些属性本身不是可观察的。

您有2个选择:

  1. 使每个可以更新的对象的每个属性都可观察。如果选择此选项,请阅读this question
  2. 替换整个对象本身。

您提到替换无效。你是这样吗?

var viewModel = function(){
  var self = this;
  
  //demo
  var itemIndex = {
    id:1
  }
  
  self.displayProductData = ko.observableArray([
    {id: 0, description: 'desc 1'},
    {id: 1, description: 'desc 2'}
  ]);
  self.replaceObject = function(data, event){
    var oldObject = self.displayProductData().find(function(arrayObject){ 
        return data.id === arrayObject.id; 
      });
    var newObject = Object.assign({}, oldObject);
    newObject.description = "replace method desc";
    self.displayProductData.replace(oldObject, newObject);
  };
  
  self.replaceObjectWithSplice = function(data, event){
    var oldObject = self.displayProductData().find(function(arrayObject){ 
      return data.id === arrayObject.id; 
    });
    var newObject = Object.assign({}, oldObject);
    newObject.description = "splice desc";
    self.displayProductData.splice(data.id, 1, newObject);
  };
};

ko.applyBindings(new viewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>



<ul data-bind="foreach: displayProductData">
    <li>
      <span data-bind="text: id"></span>, 
      <span data-bind="text: description"></span>
      <button data-bind="click: $parent.replaceObject">Replace</button>
      <button data-bind="click: $parent.replaceObjectWithSplice">Splice</button>
    </li>
</ul>

注意:如果要替换大量数据,我的答案并不是最有效的方法-每次创建新对象都需要额外的内存。

编辑: 根据评论,我将按钮移到了foreach循环内,以显示当您从敲除对象(在本例中为displayProductData)中调用函数时,该函数会自动获取当前行数据,以及event