гарантированный индексированный объект в массиве в порядке - PullRequest
0 голосов
/ 22 марта 2019

расширение этот вопрос

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

Отчасти причина, по которой это делается так: Я не хочупропускать элементы массива в любой точке процесса (NO ["a", , "t"] during the process).Это означает, что порядок вставки имеет значение.

let string_length = 10;

let o = {
  0: "a",
  4: "q",
  7: "t",
  3: "p",
  6: "h",
  1: "z",
  2: "t",
  5: "a",
  9: "b",
  8: "z"
};

function obj_to_arr(o) {
  // this returns ["a","z","t","p","q","a","h","t","z","b"]
}

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

Есть ли способ реализовать это?

Ответы [ 3 ]

0 голосов
/ 22 марта 2019

Вы можете исправить это двумя возможными способами (и, возможно, еще).

Массив

Либо вы добавляете объекты, содержащие ключ и значение в массив.

array.push({c: "a"}) или array.push({ key: c, value: "a"}), затем добавьте следующий и т. Д.

Функция Push помещает элемент в конец массива.

Сортированный объект

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

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

const someObject = {
  c: "a",
  4: "q",
  7: "t",
  b: "p",
  6: "h",
  1: "z",
  2: "t",
  5: "a",
  a: "b",
  8: "z"
};


function obj_to_arr(obj) {
  let result = []
  
  // Get keys from object as an array
  let keys = Object.keys(obj)
  console.log('keys: ', keys)
  
  // Sort the array in alphabetical order
  let sorted = keys.sort()
  console.log('sorted: ', sorted)
  
  // Add each value to the resulting array
  sorted.forEach(function(key) {
    console.log('adding ' + obj[key] + ' to array')
    result.push(obj[key])
  })

  console.log('result: ', result)
  return result
}

// Call the function
obj_to_arr(someObject)
0 голосов
/ 22 марта 2019

Краткий ответ: «Вы не можете» из-за спецификации Javascript.

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

Если упорядочение действительно имеет значение, вам не следует использовать объектный примитив. Либо массив кортежей (с гарантированным порядком):

let fixedList = [
  { key: 0, value: 'a' },
  { key: 4, vlaue: 'q' },
  ...
];

или вы можете использовать Map , которая существует , в частности , как способ иметь «объект с тем же порядком пар ключ / значение, который вы объявили».

Из двух, для транспортировки данных вы, вероятно, хотите первое, а для запуска кода вы обычно хотите второе.

0 голосов
/ 22 марта 2019

Используя Object.keys(), вы можете получить массив ключей, отсортировать их численно, затем сопоставить , что отсортировало массив в единицу со значениями.

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

Например

let o = {"0":"a","1":"z","2":"t","3":"p","4":"q","5":"a","6":"h","7":"t","8":"z","10":"b"}

let sortedValues = Object.keys(o)
    .sort((a, b) => a - b)  // numeric comparison
    .map(k => o[k])         // map to values

console.info(sortedValues)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...