Подчеркивание: потеря ссылки на массив объекта

1

Я пытаюсь сортировать массив с помощью подчеркивания внутри функции. Я теряю ссылку на родительский массив "список", который передается функции "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);

Fiddle, который я использовал для этого: https://jsfiddle.net/9zo3qnej/1/

PS: Я новичок, чтобы подчеркнуть, а также javascript.

  • 0
    И что именно является «родительским объектом» в этом контексте?
  • 0
    массив 'list' вне функции.
Показать ещё 4 комментария
Теги:
underscore.js

1 ответ

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>

Также обратите внимание, что второй sortBy не является типом сортировки then by типу. Это означает, что последний вид распространен, а "текст" - это основной порядок сортировки, а затем дата. Если это должно быть наоборот, сортировки должны быть отменены.

Второй способ - использовать вместо него собственный Array.sort. Это изменяет сам порядок (это не то же самое, что присваивание переменной), и имеет дополнительную выгоду, что вы можете сравнить оба свойства за один раз.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню