【问题标题】:Cannot reorder an array of objects in JS无法在 JS 中重新排序对象数组
【发布时间】:2016-02-29 16:43:21
【问题描述】:

我有一个对象数组,它们以块的形式呈现给用户。他们可以拖放来改变这些块的出现顺序,然后我想改变数组中对象的位置。

$scope.myArray = [{a:1,b:2,c:3}, {a:11,b:22,c:33}, {a:111,b:222,c:333}];

function orderChanged(event) {
  console.log($scope.myArray);
    //logs [{a:1,b:2,c:3}, {a:11,b:22,c:33}, {a:111,b:222,c:333}]

  console.log("source:", event.source.index, "dest:", event.dest.index);
    //logs source: 1 dest: 2

  $scope.myArray.move(event.source.index, event.dest.index);

  console.log($scope.myArray);
    //logs [{a:1,b:2,c:3}, {a:11,b:22,c:33}, {a:111,b:222,c:333}]
};

//this is going to rearrange the array
Array.prototype.move = function (from, to) {
  this.splice(to, 0, this.splice(from, 1)[0]);
};

orderChange 事件将源索引和目标索引作为整数表示它们呈现给用户的顺序,它还映射到它们在发生任何移动之前在数组中的位置。

我无法让数组重新排列,每次我在 orderChange 函数中记录数组时,两个日志都返回相同的顺序。

数组重新排序的所有其他示例都是针对不包含对象的数组,我想知道这是否是我的代码混乱的原因?

【问题讨论】:

  • 尝试放一个console.log(this);在 move 函数的主体中,Javascript 的 this 有时会令人困惑 ^^
  • 你正在使用 AngularJS。你为什么要搞乱 DOM?为每个对象添加一个名为 Order 的属性,让 Angular 进行同步……这就是本意。
  • @Vi100 你能详细说明你的意思吗?
  • 简而言之,看看这个模块,也许它会让你的生活更轻松:ngmodules.org/modules/ng-sortable
  • 我正在测试您的代码并且工作正常。你在哪里修改 Array 原型?只需尝试用实际执行重新排序和测试的代码替换对 move() 的调用...

标签: javascript arrays object array-splice


【解决方案1】:

我正在测试您的代码并且工作正常。你在哪里修改 Array 原型?只需尝试用实际执行重新排序和测试的代码替换对 move() 的调用...

无论如何,您正在使用 AngularJS。你为什么要搞乱 DOM?为每个对象添加一个名为 Order 的属性,然后让 Angular 进行同步……这就是本意。

简而言之,看看这个模块,也许它会让你的生活更轻松:

http://ngmodules.org/modules/ng-sortable

【讨论】:

  • 我对放置日志的位置感到困惑,您指示我通过您的 cmets 实现这一点。谢谢
【解决方案2】:

我认为,您的代码可以正常工作,但日志不行。

console.log 可能不代表运行时的值,而是显示时的值,尤其是多维对象和数组。

尝试不同的日志以查看console.log($scope[0].a, $scope[1].a, $scope[2].a)

您可能需要检查其他浏览器,因为这似乎是 Chrome 问题,请参阅此处:
Is Chrome's JavaScript console lazy about evaluating arrays?
Wrong value in console.log

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多