下划线:失去对对象数组的引用

时间:2017-07-29 22:48:02

标签: javascript underscore.js

我正在尝试使用函数内部的下划线对数组进行排序。我正在丢失对父数组的引用' list'正在被传递给' orderData'使用下划线时的功能' sortBy'。

'的console.log'函数调用后没有给我排序' list'宾语。我需要能够在不丢失引用的情况下对数组进行排序。我做错了吗?

function orderData(data, testObj) {
  data = _.chain(data)
    .sortBy(function(item) {
      return new Date(item.dt).getTime();
    }).sortBy('text').value();
  testObj.x = "updated";
  console.log(data, testObj);
}

var list = [
{id: 3,dt: new Date('8/1/17'),text: 'a'}, 
{id: 1,dt: new Date('5/1/17'),text: 'a'}, 
{id: 4,dt: new Date('5/1/17'),text: 'b'},
{id: 2,dt: new Date('5/10/17'),text: 'a'}];

var testObj = {
  x: "Start"
};

//console.log(list,testObj);
orderData(list, testObj);
console.log(list, testObj);

小提琴我正在使用这样做: https://jsfiddle.net/9zo3qnej/1/

PS:我是新手,也是javascript的新手。

1 个答案:

答案 0 :(得分:0)

在函数内部重新分配data时,只有局部变量才会被更改。变量list本身不能通过其传递的参数进行更改。 (在更一般的术语中,参数未通过'参考')

没有重写太多的最直接的解决方案是让函数返回已排序的数组并重新分配list



function orderData(data) {
  return _.chain(data)
    .sortBy(function(item) {
      return item.dt.getTime();
    }).sortBy('text').value();  
}

var list = [
{id: 3,dt: new Date('8/1/17'),text: 'a'}, 
{id: 1,dt: new Date('5/1/17'),text: 'a'}, 
{id: 4,dt: new Date('5/1/17'),text: 'b'},
{id: 2,dt: new Date('5/10/17'),text: 'a'}];

list = orderData(list);
console.log(list);

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
&#13;
&#13;

另请注意,第二个sortBy不是then by类型的排序。这意味着,最后一种是流行的,&#39; text&#39;是主要的排序顺序,然后是日期。如果它应该是相反的方式,那么应该颠倒各种类型。

第二种方式是使用js native Array.sort代替。这会改变订单本身(这与分配给变量不同),并且具有额外的好处,您可以一次比较两个属性。