Как рандомизировать порядок свойств массива объектов в Javascript

У меня есть массив объектов с 11 свойствами, и я хочу случайным образом перемешать свойства, появляющиеся в массиве.

Для ясности, порядок объектов массива будет таким же. Я хочу рандомизировать порядок свойств внутри объекта и сохранить этот порядок для каждого объекта.

Вот образец моего массива:

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

var list = [
{
    "ID": 0,
    "Name": "Mark",
    "Address": "2323 st",
    "Phone": 511 232 2000,
    "Score": 345
},
{
    "ID": 1,
    "Name": "Catrina",
    "Address": "2323 st",
    "Phone": 511 232 2100,
    "Score": 3452
} //and 1000 more objects...

И это то, что я ищу (порядок должен быть изменен при нажатии кнопки)

var list2 = [
{
    "Score": 345
    "Name": "Mark",
    "Address": "2323 st",
    "ID": 0,
    "Phone": 511 232 2000, 
},
{
    "Score": 3452
    "Name": "Catrina",
    "Address": "2323 st",
    "ID": 1,
    "Phone": 511 232 2100,  
} //and 1000 more objects...

Я хочу получить вывод list2 с теми же данными, но в случайном порядке свойств. Функция randomize будет вызываться всякий раз, когда кто-то нажимает кнопку, это я смогу сделать, как только найду способ, чтобы функция делала то, что я хочу.

У вас есть четко сформулированная проблема, это хорошо - не могли бы вы опубликовать написанный вами код, который не работает должным образом, чтобы мы могли увидеть, что идет не так? (ТАК не здесь, чтобы писать за вас весь сценарий)

CertainPerformance 05.01.2019 02:42

просто так я понимаю - порядок свойств для каждого объекта одинаков для всех объектов в массиве в list2 - или свойства каждого объекта рандомизированы индивидуально?

Dan 05.01.2019 02:52

Я пробовал много вещей, но не придерживался определенного решения, поэтому я не публиковал код. Я продолжу над чем-то работать и опубликую, когда станет чище.

user10840968 05.01.2019 02:55

Да, порядок свойств будет одинаковым для каждого объекта в списке 2

user10840968 05.01.2019 02:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
556
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы говорите о случайном перемешивании массива, ниже описано, как это сделать:

function shuffle(array) {

  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}

Ответ взят от здесь

Я пробовал код, но не могу заставить его работать. Разве это не простой массив, тогда как у меня есть массив с несколькими свойствами? Я могу ошибаться, поскольку я новичок в js.

user10840968 05.01.2019 03:20

OP - это нет, пытающийся перетасовать свой массив. ES6 + действительно гарантирует порядок собственности объекта.

CertainPerformance 05.01.2019 05:33
Ответ принят как подходящий

Каждый раз, когда вы создаете новый объект, порядок, в котором вы объявляете его свойства, соответствует порядку, в котором они появляются при выводе на консоль, или в строковом формате через JSON.stringify ().

var list = [
{
    "ID": 0,
    "Name": "Mark",
    "Address": "2323 st",
    "Phone": "511 232 2000",
    "Score": 345
},
{
    "ID": 1,
    "Name": "Catrina",
    "Address": "2323 st",
    "Phone": "511 232 2100",
    "Score": 3452
}]

function remap(d) {
    const {ID, Name, Address, Phone, Score} = d; 
    return {Score, Name, Address, ID, Phone}
}
console.info(list.map(remap))

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

var list = [{
    "ID": 0,
    "Name": "Mark",
    "Address": "2323 st",
    "Phone": "511 232 2000",
    "Score": 345
  },
  {
    "ID": 1,
    "Name": "Catrina",
    "Address": "2323 st",
    "Phone": "511 232 2100",
    "Score": 3452
  }
]


function randomizePropertyOrder() {
  // If we want the property order to remain the same throughout the list
  // we must declare it inside some closure
  let propsOrder;

  // quick way to randomize any list of items. 
  function randomizeList(list) {
    return list
             .map((k, i) => { return { k, i: Math.random(); } })
             .sort((a, b) => { return a.i - b.i; })
             .map((d) => { return d.k; })
  }

  return (d) => {
    // let's compute a random property order once and only once
    if (propsOrder === undefined) { propsOrder = randomizeList(Object.keys(d)) }
    return propsOrder.reduce((acc, k) => {
      acc[k] = d[k];
      return acc;
    }, {})

  }
}
const remap = randomizePropertyOrder()
console.info(list.map(remap))

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

user10840968 05.01.2019 03:15

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

widged 05.01.2019 03:29

Немного поздно на вечеринку.

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

var list = [
{
    "ID": 0,
    "Name": "Mark",
    "Address": "2323 st",
    "Phone": 5112322000,
    "Score": 345
},
{
    "ID": 1,
    "Name": "Catrina",
    "Address": "2323 st",
    "Phone": 5112322100,
    "Score": 3452
}
];

var list2 = list.slice();//making replica
randomizeList(list2);
console.info(list2);
console.info(list);


function randomizeList(list2) {
    for (var i = list2.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = list2[i];
        list2[i] = list2[j];
        list2[j] = temp;
    }
}

Другие вопросы по теме