Сортировать по нескольким объектам в массиве в Javascript - PullRequest
1 голос
/ 22 октября 2019
var customersObj= [ 
    { recordId: "123", groupID: "1992" ,memberID:"10" Name : "John"     },
    { recordId: "141",  groupID: "1994" ,memberID:"13", Name : "Arrow"  },
    { recordId: "111", groupID: "1991",memberID:"12", Name : "Mike" }
];

Мне нужно вернуть массив, отсортировав их сначала по recordId, затем по groupID, затем по memberID ...

Я пробовал это, но не получил ожидаемогорезультат "

return _.sortBy(customersObj,'recordID','groupID','memberID');

Может ли кто-нибудь помочь здесь в этом ...

Ответы [ 7 ]

2 голосов
/ 22 октября 2019

Обратите внимание, что ваши *ID являются строками с, поэтому я использовал Array.map для преобразования их в целые, а затем _.sortBy работает ожидаемым образом.

Iдобавлены дополнительные значения для проверки под-сортировки.

const customersObj = [{
  recordId: "123",
  groupID: "1992",
  memberID: "10",
  Name: "John"
}, {
  recordId: "141",
  groupID: "1994",
  memberID: "13",
  Name: "Arrow"
}, {
  recordId: "111",
  groupID: "1991",
  memberID: "12",
  Name: "Mike"
}, {
  recordId: "123",
  groupID: "1991",
  memberID: "12",
  Name: "Sean"
}, {
  recordId: "123",
  groupID: "1991",
  memberID: "11",
  Name: "Sara"
}];

const result = customersObj.map(item => ({
  recordId: parseInt(item.recordId, 10),
  groupID: parseInt(item.groupID, 10),
  memberID: parseInt(item.memberID, 10),
  Name: item.Name
}));

console.log(_.sortBy(result, 'recordId', 'groupID', 'memberID'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
0 голосов
/ 22 октября 2019

Привет, я пытался решить вашу проблему :)

const display = document.querySelector(".display");

var customersObj= [ 
    { recordId: "123", groupID: "1992" ,memberID:"10", Name : "John"     },
    { recordId: "141",  groupID: "1994" ,memberID:"13", Name : "Arrow"  },
    { recordId: "111", groupID: "1991",memberID:"12", Name : "Mike" }
];
customersObj.sort(function (a, b) {
    return a.recordId - b.recordId || b.groupID - a.groupID || c.memberID - c.memberID;
});
customersObj.map(obj => {
  const item = document.createElement("div");
  item.textContent += obj.recordId + " " + obj.groupID + " " + obj.memberID +" "+ obj.Name;
  display.appendChild(item);
});
<div class="display">
</div>
0 голосов
/ 22 октября 2019

С помощью lodash можно получить массив ключей и правильно подобрать нужные ключи.

var customersObj = [{ recordId: "123", groupID: "1992", memberID: "10", Name: "John" }, { recordId: "141", groupID: "1994", memberID: "13", Name: "Arrow" }, { recordId: "111", groupID: "1991",
memberID: "12", Name: "Mike" }];

console.log(_.sortBy(customersObj, ['recordId', 'groupID', 'memberID']));
//                                 ^        ^                        ^
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 22 октября 2019

Вы можете отсортировать array of object, используя несколько значений, следующим способом

var arrayOfObj = [ 
    { recordId: "123", groupID: "1992" ,memberID:"10" , Name : "John"     },
    { recordId: "141",  groupID: "1994" ,memberID:"13", Name : "Arrow"  },
    { recordId: "111", groupID: "1991",memberID:"12", Name : "Mike" }
];

let sortBy = [{
  prop:'recordId',
  direction: 1
},{
  prop:'lastName',
  direction: 1
},{
  prop:'memberID',
  direction: 1
}];

arrayOfObj.sort(function(a,b){
  let i = 0, result = 0;
  while(i < sortBy.length && result === 0) {
    result = sortBy[i].direction*(a[ sortBy[i].prop ].toString() < b[ sortBy[i].prop ].toString() ? -1 : (a[ sortBy[i].prop ].toString() > b[ sortBy[i].prop ].toString() ? 1 : 0));
    i++;
  }
  return result;
})

console.log(arrayOfObj, ":::::");
0 голосов
/ 22 октября 2019

для сортировки нескольких полей, сделайте это так

customersObj.sort(function(a, b) {
    return a["recordId"] - b["recordId"] || a["groupID"] - b["groupID"] || a["memberID"] - b["memberID"];
});
0 голосов
/ 22 октября 2019

вы можете использовать метод сортировки с лямбда-функцией для сортировки.

const list = [
{      color: 'white', size: 'XXL' },
    { color: 'red', size: 'XL' },
   { color: 'black', size: 'M' }
]
list.sort((a, b) => (a.color > b.color) ? 1 : -1) // you can add different conditions here.
0 голосов
/ 22 октября 2019

Попробуйте использовать этот подход:

const customersObj= [
  { recordId: "123", groupID: "1992" ,memberID:"10", Name : "John"     },
  { recordId: "141",  groupID: "1994" ,memberID:"13", Name : "Arrow"  },
  { recordId: "111", groupID: "1991",memberID:"12", Name : "Mike" }
];

const sorted = customersObj.sort((a,b)=>{
  return a.recordId - b.recordId || a.groupID - b.groupID || a.memberID - b.memberID;
})    

console.log(`sorted`, sorted);
...