使用AngularJS angular.extend独立地向数组的每个对象添加属性

Eri*_*ans 8 javascript local-storage angularjs

我有一个带有对象的现有数组,并在第一步创建了几个属性.它由以下函数创建:

$scope.recordlist = extractRecordJSONFromLocalStorage();
$scope.addRecord = function () {
    $scope.recordlist.push(
            {
                date: $scope.dateJson, 
                time: $scope.time, 
                car: $scope.carList.code, 
                driver: $scope.driverList.name,
                from: $scope.locationList.place,
                destination: $scope.locationList2.place, 
                pax: $scope.paxList
            }
        );

    $scope.custom = $scope.custom === false ? true: false;
    $scope.carList = 0;
    $scope.driverList = 0;
    $scope.locationList = 0;
    $scope.locationList2 = 0;
    jsonToRecordLocalStorage($scope.recordlist);
};
Run Code Online (Sandbox Code Playgroud)

它导致以下数组:

[{
  "date":"2014 10 16",
  "time":"20.22",
  "car":"396",
  "driver":"Seb",
  "from":"A",
  "destination":"B",
  "pax":"3"
}]
Run Code Online (Sandbox Code Playgroud)

我要做的是在下一步使用ng-click将另一个属性添加到现有对象中.我尝试过以下功能,但它似乎不起作用.

$scope.insertRecord = function (recordlist) {

    var arrival = { 'arrival' : moment().format("HH.mm") }
    console.log(arrival)
    angular.extend($scope.recordlist, arrival)


    jsonToRecordLocalStorage($scope.recordlist);
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的最终结果如下:

[{
  "date":"2014 10 16",
  "time":"20.22",
  "car":"396",
  "driver":"Seb",
  "from":"A",
  "destination":"B",
  "pax":"3",
  "arrival":"23.10"
}]
Run Code Online (Sandbox Code Playgroud)

也许还需要考虑的另一件事是,在应用程序中,它存在列出许多不同对象的可能性,一些arrival已经定义了属性,但有些将在以后及时使用.

有什么指针吗?

编辑

我得到的2个解决方案但是没有完成我想要的工作,所以我可能不清楚我想要做什么.

我将一组对象保存到一个数组中,每个对象都有一个属性arrival,将在第二步定义.

所以首先我创建一个像这样的对象数组:

[
 {
  "date":"2014 10 16",
  "time":"20.42",
  "car":"396",
  "driver":"Seb",
  "from":"A",
  "destination":"B",
  "pax":"3",
 },
 {
  "date":"2014 10 16",
  "time":"20.12",
  "car":"319",
  "driver":"Seb",
  "from":"C",
  "destination":"D",
  "pax":"4",
 },
 {
  "date":"2014 10 16",
  "time":"20.22",
  "car":"396",
  "driver":"Seb",
  "from":"G",
  "destination":"A",
  "pax":"1",
 }
]
Run Code Online (Sandbox Code Playgroud)

它以类似于表格的布局显示在视图上.每行包含来自对象的数据,并且最初不包括该属性,arrival因为该应用程序跟踪汽车移动并且汽车尚未到达目的地.

每一行还有一个按钮触发insertRecord(),它定义了到达时间,并且它应该arrival独立地将属性包含在每个对象中.

所以在这个例子中,也许第二个对象的汽车到了,我希望能够只为这个特定的对象添加arrival属性,让数组如下:

[
 {
  "date":"2014 10 16",
  "time":"20.42",
  "car":"396",
  "driver":"Seb",
  "from":"A",
  "destination":"B",
  "pax":"3"
 },
 {
  "date":"2014 10 16",
  "time":"20.12",
  "car":"319",
  "driver":"Seb",
  "from":"C",
  "destination":"D",
  "pax":"4",
  "arrival":"20.35"
 },
 {
  "date":"2014 10 16",
  "time":"20.22",
  "car":"396",
  "driver":"Seb",
  "from":"G",
  "destination":"A",
  "pax":"1"
 }
]
Run Code Online (Sandbox Code Playgroud)

dfsq提出的2个解决方案允许我既定义数组的第一个对象的到达,又为所有对象定义,但不是分别为每个对象定义.

这是调用insertData的HTML代码:

<div class="row msf-row" ng-repeat="record in recordlist | filter: search">
      <div class="col-md-1">{{record.time}}</div>
      <div class="col-md-1"><strong>{{record.car}}</strong></div>
      <div class="col-md-1">{{record.driver}}</div>
      <div class="col-md-3">{{record.from}}</div>
      <div class="col-md-3">{{record.destination}}</div>
      <div class="col-md-1">{{record.pax}}</div>
      <div class="col-md-1">
           <button ng-click="insertRecord()" ng-show="!record.arrival"><i class="fa fa-cog"></i></button>{{record.arrival}}
      </div>
</div>   
Run Code Online (Sandbox Code Playgroud)

如此,任何有关如何到达那里的提示?

dfs*_*fsq 12

根据你的代码$scope.recordlist是一个对象数组.所以你可能想要这个:

angular.extend($scope.recordlist[0], arrival);
Run Code Online (Sandbox Code Playgroud)

UPD要更新数组中的每个对象,您可以使用map方法:

$scope.recordlist = $scope.recordlist.map(function(obj) {
    return angular.extend(obj, arrival);
});
Run Code Online (Sandbox Code Playgroud)


a b*_*ver 8

如果正确理解您的问题,您希望通过添加更新单个记录arrival.将记录传递给insertRecord:

<button ng-click="insertRecord(record)" ng-show="!record.arrival">
Run Code Online (Sandbox Code Playgroud)

在那里,您可以将属性添加到相应的记录:

$scope.insertRecord = function (record) {
  record.arrival =  moment().format("HH.mm");
Run Code Online (Sandbox Code Playgroud)