javascript - 替换数组内容的简短方法

标签 javascript arrays angularjs underscore.js

有没有方便的方法来替换数组的内容,并保留对它的引用?我不想像这样替换数组:

var arr1 = [1,2,3];
var referenceToArr1 = arr1;
var arr2 = [4,5,6];

arr1 = arr2;
// logs: [4,5,6] false
console.log(arr1, arr1===referenceToArr1);
// logs [1,2,3]
console.log(referenceToArr1);

这样 arr1 就有了 arr2 的内容,但是我在 referenceToArr1 中丢失了引用,因为它仍然指向 原创 arr1.

通过这种方式,我不会丢失引用:

var arr1 = [1,2,3];
var referenceToArr1 = arr1;
var arr2 = [4,5,6];

arr1.length = 0;
for (var i = 0; i < arr2.length; i++) {
  arr1.push(arr2[i]);
}
// logs: [4,5,6] true
console.log(arr1, arr1===referenceToArr1);
// logs: [4,5,6]
console.log(referenceToArr1)

这里的缺点是,我必须清空 arr1.length = 0,遍历 arr2 的每个元素并将其推送到 arr1 手动。

我的问题是:

  • 当然,我可以为此编写一个帮助程序,但最有效的方法是什么?
  • 是否有一种简短的普通 javascript 方法来执行此操作(也许是一行代码?)
  • 我也在使用 underscore.js,但还没有找到解决此类问题的方法。有没有办法用 underscore.js 做到这一点?

背景:

我有一个带有服务的 AngularJS 应用程序。在这个服务中,我有一个数组来保存从服务器加载的所有元素。来自服务的数据绑定(bind)到 Controller 并在 View 中使用。当来自服务的数据发生变化时(例如发生重新获取),我想自动更新我的 Controller 变量和它绑定(bind)到的 View 。

这是一个 Plunker:http://plnkr.co/edit/8yYahwDO6pAuwl6lcpAS?p=preview

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, myService) {
  $scope.name = 'World';
  myService.fetchData().then(function(data) {
    console.log(data)
    $scope.data = data;
  })
});

app.service('myService', function($timeout, $q) {
  var arr;
  var deferred;

  var loadData = function() {
    // here comes some data from the server
    var serverData = [1,2,3];
    arr = serverData;
    deferred.resolve(arr);

    // simulate a refetch of the data
    $timeout(function() {
      var newServerData = [4,5,6];
      // this won't work, because MainCtrl looses it's reference
      // arr = newServerData;
    }, 1000);

    $timeout(function() {
      var newServerData = [7,8,9];
      arr.length = 0;
      [].push.apply(arr, newServerData);
    }, 2000);

    $timeout(function() {
      var newServerData = [10,11,12];
      [].splice.apply(arr, [0, arr.length].concat(newServerData));
    }, 3000);
  }

  return {
    fetchData: function() {
      deferred = $q.defer();

      loadData();

      return deferred.promise;
    }
  }
})

和 View :

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.2.x" src="https://code.angularjs.org/1.2.16/angular.js" data-semver="1.2.16"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <ul>
      <li ng-repeat="d in data">{{d}}</li>
    </ul>
    3 refetches every second
  </body>

</html>

最佳答案

这个怎么样:

// 1. reset the array while keeping its reference
arr1.length = 0;
// 2. fill the first array with items from the second
[].push.apply(arr1, arr2);

参见:

  1. How to empty an array in JavaScript?
  2. .push() multiple objects into JavaScript array returns 'undefined'

关于javascript - 替换数组内容的简短方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486687/

相关文章:

javascript - 如何停止在特定元素上沿特定方向滚动?

c++ - 基本 C++ 函数指针和结构

javascript - 将使用 Javascript/Jquery 构建的 Web 应用程序的一部分转换为 Angular 2

javascript - Jasmine:调用一个函数,而不是用 andReturn() 代替

javascript - 动态替换数组中的值

JavaScript 模板引擎

javascript - Object.is 与 ===

c++ - 在函数内修改数组指针

arrays - 如何在 Rust 0.8 中将 Zip 转换为数组?

javascript - Angular : sort collection by list of values