Сортировка объектов 4/5


#1

Вообще легкотня, даже сокращу

const getSortedArray = (array, key) => array.sort((a,b) => a[key] - b[key]);


#2

Мой вариант получился посложнее, но рабочий. Все таки в уроках обучения не было таких командб как “const”, “.sort”.

var getSortedArray = function (mass, key) {
for (var i = 0; i < mass.length - 1; i++) {
for (var j = i + 1; j < mass.length; j++) {
if (mass[i][key] > mass[j][key]) {
var swap = mass[i];
mass[i] = mass[j];
mass[j] = swap;
}
}
}
return mass;
}


#3

Добрый день, вижу Ваши сообщения с кодом почти в каждой задаче. Но Ваш код намного короче остальных, почему? Где почитать про это? И почему в курсе не рассказывают об этом?


#4

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


#5

Просьба подсказать , в контексте работы надо данной задачей обнаружил такое несоотвествие. Касаемо объектов, переменная же должна сохранять только ссылку на объект, В приведенном мной примере переменная change стала независимым объектом. Как так?


#6
var obj = {"name":"Ляксандр","age":"15"};
var copy = obj;
obj = "30";
console.log(copy);
console.log(obj);

Объект существует сам по себе, независимо в какую ячейку памяти вы его определите.
Когда пропадает 1ая ссылка obj (в нее записывается примитив - строка “30”), всё еще остается 2ая ссылка copy и объект все еще доступен по ней.

также и с вашей задачей, есть объект

{ "name": "Василий","age": "6" }

сначала он доступен из массива arr

console.log(arr[0]);

потом ему дают вторую ссылку -

let change = arr[0];

потом затирают 1 элемент массива (с индексом 0) с присвоением ему примитива - число 25:

 arr[0] = 25; // затёрли основную ссылку

тот самый объект с Василием все еще доступен по ссылке change, хотя он исчез из массива arr

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

по сути также работают и замыкания, т.к. функция это объект


#7

спасибо, дошло


#8
var getSortedArray = function (arrayOfObjects, key) {
  var swap;
  for (var i = 0; i < arrayOfObjects.length - 1; i ++) {
    
    for (var j = i + 1; j < arrayOfObjects.length; j ++) {
      if (arrayOfObjects[j][key] < arrayOfObjects[i][key]) {
        swap = arrayOfObjects[i];
        arrayOfObjects[i] = arrayOfObjects[j];
        arrayOfObjects[j] = swap;
      }
    }
    
  }
  return (arrayOfObjects);
};

#9

На тот случай если тип значения будет ‘string’, а не ‘number’

typeof
const getSortedArray = function(array, key) {
  return array.sort((a, b) => 
    typeof(a[key]) === 'string' 
      ? a[key].localeCompare(b[key]) 
      : a[key] - b[key] 
  );
}

#11

Объясните, пожалуйста, зачем mass.length - 1
Ведь оно и так работает если не отнимать единицу


#12

чтобы количество итераций уменьшить, потому что самый большой элемент и так помещается в конец, нет смысла его еще раз сравнивать (тем более с undefined, т.к. j будет равно mass.length и такой элемент будет undefined) и упростить сортировку мб. но вообще для сортировки есть метод с колбеком: .sort((a,b) => a[key] - b[key])


#13

Да что вы знаете о решениях посложнее! Вот как я решил эту задачу. Наверное в душе я индус…

var getSortedArray=function(sortArray, keyName){

var age=[];
var min=[];
var end=[];
for(var x=0;x<sortArray.length;x++){
age.push(sortArray[x][keyName]);

}
//переносим ключевые значения в отдельный массив

var min=0;

for(var j=0;j<sortArray.length;j++){
for(var i=0;i<sortArray.length;i++){

if (age[i+1]<age[i]){
min=age[i];
age[i]=age[i+1];
age[i+1]=min;

}

}
//сортируем этот массив
}

for(var z=0;z<sortArray.length;z++){
for(var y=0;y<sortArray.length;y++)
if(sortArray[y]===end[z]){
continue;
}else if(sortArray[z][keyName]===age[y]){
end[y]=sortArray[z];
}
}
//сравниваем ключевые значения со значениями отсортированного//массива, если совпадает, то записываем в новый массив по //индексу. Предварительно вводим проверку на одинаковые //значения.

return end;
}


#14

Красиво написал))))))))))))))


#15

А зачем во 2-ой строчке кода к “mass.length приписывать (- 1)”? Я понимаю что так нужно, но можете пожалуйста объяснить.


#16

Моя уметь цикл и условие. Больше не уметь. Таки придется покупать интенсивы :rofl:

var getSortedArray = function (arr, nameKey) {
  arrValues = [];
  for (var i=0; i<arr.length; i++) {
    arrValues[i] = arr[i][nameKey];
  };
  arrValues.sort(function(a, b) { return a - b; });
  for (var i=0; i<arr.length; i++) {
    for (var j=0; j<arr.length; j++) {
      if (arrValues[i] === arr[j][nameKey]) {
        arrValues[i] = arr[j];
      };
      if (arrValues[i] === arrValues[i-1]) {
        arrValues[i] = arr[j];
      };
    };
  };
  return arrValues;
};