Как я могу динамически задавать ключи объектов переменной с помощью Javascript?

#javascript #arrays #reactjs #object

Вопрос:

 export function getNoteKeys() {
    const notesObject = {}
    for (let i = 0; i < localStorage.length; i  ) {
        const key = localStorage.key(i)
        const value = localStorage[key]
        notesObject[key] = value
    }
    store.dispatch(SetActionForNotes(_.values(notesObject).sort(function(a, b) {
        return a > b
    })))
}
 

Текущий вывод, который я получаю для приведенного выше кода, таков…

 {0: "a", 1: "b", 2: "c", 3: "d"}
 

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

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

В качестве примера того, что я пытаюсь сделать…

 const obj = [{id: 1, value: "a"}, {id: 2, value: "b"}...]
 

Комментарии:

1. Вы пытаетесь использовать динамические ключи объектов или просто пытаетесь сопоставить каждую пару ключ-значение из локального хранилища с новой формой объекта? Ваш пример вывода obj не соответствует тому, что делает код, и не является допустимым объектом JS. Непонятно, о чем вы просите. Кроме того, компаратор функции сортировки должен возвращать числовое значение, т. Е. [-1, 0, 1], а не логическое значение для указания порядка сортировки.

2. Вы уже делаете это с помощью: notesObject[ключ] = значение

3. {[{id: 1}, {value: "a"}], [{id: 2}, {value: "b"}]...} недопустимый синтаксис объекта, вы пытаетесь получить что-то вроде [{ id: 1, value: 'a' }, { id: 2, value: 'b' }, ...] в массиве?

4. @DrewReese да, это то, к чему я стремлюсь. Я отредактирую свой вопрос, чтобы он был правильным.

5. Можете ли вы также включить пример значения localStorage, чтобы мы могли видеть, с чего вы начинаете?

Ответ №1:

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

 Object.keys(localStorage).reduce((acc,key)=>{
  return[...acc,{id:key,value:localStorage[key]}]
},[])
 

Комментарии:

1. Я предполагаю value:asd[key] , что был добавлен по ошибке, ваш ответ сработал, как только я удалил asd

Ответ №2:

Похоже, что localStorage это объект (по сравнению с массивом), и если это так, вы также можете использовать Object.entries и сопоставлять массив пар ключ-значение [{ id: 1, value: 'a' }, { id: 2, value: 'b' }, ...] .

 Object.entries(localStorage).map(([id, value]) => ({ id, value }))
 
 const localStorage = {
  0: 'a',
  1: 'b',
  2: 'c',
};

const res = Object.entries(localStorage).map(([id, value]) => ({ id, value }));

console.log(res); 

Хотя, поскольку объекты являются просто ассоциативными массивами пар ключ-значение, он также работает с массивами.

 const localStorage = ['a', 'b', 'c'];

const res = Object.entries(localStorage).map(([id, value]) => ({ id, value }));

console.log(res);