Присоединение объекта к массиву при соблюдении его порядка - PullRequest
1 голос
/ 07 апреля 2020

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

function magicFunction(data){
	let index = null;
	 arr.map((val, i) => {
		 if(val.name === data.name){
			if(val.size > data.size){
		   		index = i + 1;
		   } 
		   else if (val.size <= data.size){
			   	if((arr.length !== i -1) && arr[i + 1].size < data.size){
			   		index = i - 2;
			   	} else if ((arr.length !== i -1) && arr[i + 1].size > data.size ){
			   		index = i;
			   	}
		   	}
		   }
  	});
	 if(index === null){
	 	arr.push(data);
	 } else {
	 	arr.splice(index, 0, data);
	 }
	 
}
const arr = []
magicFunction({name: 'CAT_1', size: 175});
magicFunction({name: 'CAT_5', size: 20});
magicFunction({name: 'CAT_1', size: 500});
magicFunction({name: 'CAT_6', size: 2});
magicFunction({name: 'CAT_1', size: 5000});
console.log(arr);
  • Однако, последний объект, который я добавляю, не учитывает нисходящий порядок?
  • Правильный порядок - последний добавленный, должен быть первым элементом. .
  • поэтому arr [0] должен === {name: 'CAT_1', размер: 5000}

Любая помощь будет принята.

1 Ответ

0 голосов
/ 07 апреля 2020

Делая предположения о том, как должен выглядеть вывод:

function magicFunction(data){
  arr.push(data);
  
  arr.sort((a,b) => {
    const nameNumA = parseInt(a.name.split('_')[1]);
    const nameNumB = parseInt(b.name.split('_')[1]);    
    if (nameNumA == nameNumB){
      return b.size - a.size
    } else{
      return nameNumA - nameNumB;
    } 
  });
  
  return void(0);
	 
}
const arr = []
magicFunction({name: 'CAT_1', size: 175});
magicFunction({name: 'CAT_5', size: 700});
magicFunction({name: 'CAT_5', size: 20});
magicFunction({name: 'CAT_1', size: 500});
magicFunction({name: 'CAT_1', size: 5000});
magicFunction({name: 'CAT_6', size: 2});
magicFunction({name: 'CAT_6', size: 200});
console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Вывод:

[
  {
    "name": "CAT_1",
    "size": 5000
  },
  {
    "name": "CAT_1",
    "size": 500
  },
  {
    "name": "CAT_1",
    "size": 175
  },
  {
    "name": "CAT_5",
    "size": 700
  },
  {
    "name": "CAT_5",
    "size": 20
  },
  {
    "name": "CAT_6",
    "size": 200
  },
  {
    "name": "CAT_6",
    "size": 2
  }
]

Конечно, с точки зрения производительности лучше добавлять каждый элемент, а затем сортировать один раз, а не сортировать каждый раз, когда вы вызываете функцию, но так как я хочу придерживаться способа, которым вы вызываете функцию, мне нужно сортировать каждый раз.

Кроме того, не рекомендуется изменять мутирование массив вне функции замыкания, т. е. в глобальной области видимости.

Итак, все же я бы решил это следующим образом:

const arr = []
arr.push({name: 'CAT_1', size: 175});
arr.push({name: 'CAT_5', size: 700});
arr.push({name: 'CAT_5', size: 20});
arr.push({name: 'CAT_1', size: 500});
arr.push({name: 'CAT_1', size: 5000});
arr.push({name: 'CAT_6', size: 2});
arr.push({name: 'CAT_6', size: 200});
const sortedArr = arr.sort((a,b) => {
    const nameNumA = parseInt(a.name.split('_')[1]);
    const nameNumB = parseInt(b.name.split('_')[1]);    
    if (nameNumA == nameNumB){
      return b.size - a.size
    } else{
      return nameNumA - nameNumB;
    } 
  });
console.log(sortedArr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...