Js: сортировка и перестановка массива объекта - PullRequest
0 голосов
/ 09 октября 2018

Мой объект массива подобен приведенному ниже примеру.

[
 {'email':'test@gmail.com', 'name':'abc'},
 {'email':'test1@gmail.com', 'name':'bbc'},
 {'email':'test2@gmail.com', 'name':'aaa'},
 {'email':'test3@gmail.com', 'name':'cba'},
 {'email':'test3@gmail.com', 'name':'cab'},
]

Таким образом, мой новый массив будет иметь значение ключа в паре алфавита A в качестве ключа, а все значения - это объект, имя которого начинается с A алфавит и т. Д. Еще одна вещь, если у алфавита A есть 2 объекта, которые начинаются с a , тогда я также хочу отсортировать затем в порядке возрастания, как япоказать в окончательном примере вывода ниже

окончательный вывод, который я хочу, выглядит следующим образом.

[
  "a" : [{'email':'test@gmail.com', 'name':'aaa'},{'email':'test2@gmail.com', 'name':'abc'}],
  "b" : [{'email':'test1@gmail.com', 'name':'bbc'}],
  "c" : [{'email':'test3@gmail.com', 'name':'cab'},{'email':'test3@gmail.com', 'name':'cba'}]
]

Ответы [ 6 ]

0 голосов
/ 09 октября 2018

Цикл массива, создание объекта на его основе и сортировка по мере заполнения.

const myArr = [
 {'email':'test@gmail.com', 'name':'abc'},
 {'email':'test1@gmail.com', 'name':'bbc'},
 {'email':'test2@gmail.com', 'name':'aaa'},
 {'email':'test3@gmail.com', 'name':'cba'},
 {'email':'test3@gmail.com', 'name':'cab'}
];

const finalObj = {};
function compare(a,b) {
  if (a.name < b.name)
    return -1;
  if (a.name > b.name)
    return 1;
  return 0;
}

myArr.forEach(item => {
  const alph = item.name.substr(0, 1);
 
  if (finalObj[alph]) {
    finalObj[alph] = [...finalObj[alph], item].sort(compare);
  } else {
    finalObj[alph] = [item];
  }
});

console.log(finalObj);
0 голосов
/ 09 октября 2018

var array = [
 {'email':'test@gmail.com', 'name':'abc'},
 {'email':'test1@gmail.com', 'name':'bbc'},
 {'email':'test2@gmail.com', 'name':'aaa'},
 {'email':'test3@gmail.com', 'name':'cba'},
 {'email':'test3@gmail.com', 'name':'cab'},
]

function getArray(array=[]){

let newObject = {};
array.forEach(i=>{
  let key = i['name'].slice(0,1)
  if( key && newObject[key] ){
     newObject[key].push(i)
    }else{
    newObject[key] = Array(i)
    }
  }) 
  return newObject

}

console.log(getArray(array))
0 голосов
/ 09 октября 2018

Вы можете сделать это, используя метод массива :

const list = [
    {'email':'test@gmail.com', 'name':'abc'},
    {'email':'test1@gmail.com', 'name':'bbc'},
    {'email':'test2@gmail.com', 'name':'aaa'},
    {'email':'test3@gmail.com', 'name':'cba'},
    {'email':'test3@gmail.com', 'name':'cab'},
]

const newList = list.reduce((acc, currVal) => {
    const firstLetter = currVal.name.charAt(0);
    if(!acc[firstLetter]){
        acc[firstLetter] = [];
    }
    acc[firstLetter].push(currVal);
    return acc
}, {})

console.log(newList)
0 голосов
/ 09 октября 2018

Вы можете использовать метод reduce для создания объекта и метод sort для сортировки значений по имени.

const data = [{'email':'test@gmail.com', 'name':'Abc'},{'email':'test1@gmail.com', 'name':'bbc'},{'email':'test2@gmail.com', 'name':'aaa'},{'email':'test3@gmail.com', 'name':'cba'},{'email':'test3@gmail.com', 'name':'cab'},]

const sorted = data.reduce((r, o) => {
  let key = o.name.slice(0, 1).toLowerCase();
  r[key] = (r[key] || []).concat(o);
  r[key].sort((a, b) => a.name.localeCompare(b.name));
  return r;
}, {})

console.log(sorted)
0 голосов
/ 09 октября 2018

Вы можете отсортировать массив и затем сгруппировать его.

var array = [{ email: 'test@gmail.com', name: 'abc' }, { email: 'test1@gmail.com', name: 'bbc' }, { email: 'test2@gmail.com', name: 'aaa' }, { email: 'test3@gmail.com', name: 'cba' }, { email: 'test3@gmail.com', name: 'cab' }],
    grouped = array
        .sort(({ name: a }, { name: b }) => a.localeCompare(b))
        .reduce((r, o) => {
            var group = o.name[0].toLowerCase();
            (r[group] = r[group] || []).push(o);
            return r;
        }, Object.create(null));
        
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 09 октября 2018

Вы можете использовать метод lodash groupBy для достижения желаемого результата.

var collection =[
 {'email':'test@gmail.com', 'name':'abc'},
 {'email':'test1@gmail.com', 'name':'bbc'},
 {'email':'test2@gmail.com', 'name':'aaa'},
 {'email':'test3@gmail.com', 'name':'cba'},
 {'email':'test3@gmail.com', 'name':'cab'},
]

console.log(_.groupBy(collection, (item) => {
    return item.name[0]
}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...