Как я могу изменить ключ массива со значением id в javascript?

Мой код javascript выглядит так:

<script type="text/javascript">
    var clubs = [ 
        {id: 3, name : 'chelsea'},
        {id: 6, name : 'city'},
        {id: 7, name : 'liverpool'},
        {id: 10, name : 'manchester united'},
        {id: 16, name : 'arsenal'}
    ];
    console.log(clubs)
</script>

Я хочу изменить ключ массива на значение id

Например

ключ {id: 7, name : 'liverpool'}, - 2

Я хочу поменять 2 на 7

Другой пример

ключ {id: 16, name : 'arsenal'} - 4

Это должен быть 16

Как мне это сделать?

Обновлять:

Из массива клубов

индекс {id: 3, name : 'chelsea'} - 0

индекс {id: 6, name : 'city'} - 1

индекс {id: 7, name : 'liverpool'} - 2

индекс {id: 10, name : 'manchester united'} - 3

индекс {id: 16, name : 'arsenal'} - 4

Я хочу изменить его так:

индекс {id: 3, name : 'chelsea'} - 3

индекс {id: 6, name : 'city'} - 6

индекс {id: 7, name : 'liverpool'} - 7

индекс {id: 10, name : 'manchester united'} - 10

индекс {id: 16, name : 'arsenal'} - 16

Непонятно с требованием. Не могли бы вы перефразировать проблему

Nikhil Aggarwal 11.04.2018 11:35

Нет. Ну да, но не стоит. Это приведет к неправильной длине массива.

Jeff 11.04.2018 11:37

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

JJJ 11.04.2018 11:37

Пожалуйста, поделитесь своей попыткой.

gurvinder372 11.04.2018 11:38

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

Jens Ingels 11.04.2018 11:38

@nikhilagw Я обновляю свой вопрос

Success Man 11.04.2018 11:39

например если вы сделаете clubs[16] = {id: 16, name: 'arsenal'}; - тогда у вас есть то, что вы «хотите», но тогда clubs.length будет 17 ... всего с 5 объектами в нем.

Jeff 11.04.2018 11:39

@SuccessMan - А как насчет отсутствующих идентификаторов?

Nikhil Aggarwal 11.04.2018 11:40
2
8
163
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете взять id в качестве индекса и создать разреженный массив.

var clubs = [{ id: 3, name : 'chelsea' }, { id: 6, name : 'city' }, { id: 7, name : 'liverpool' }, { id: 10, name : 'manchester united' }, { id: 16, name : 'arsenal' }];
    
clubs = clubs.reduce((r, o) => (r[o.id] = o, r), []);
    
console.log(clubs);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Какова же длина этого массива? Это может быть удивительно.

Aluan Haddad 11.04.2018 11:38

длина - это максимальный идентификатор плюс один.

Nina Scholz 11.04.2018 11:39

@Nina Scholz Длина должна быть 17. Стоит только 5

Success Man 11.04.2018 11:44

вы хотите получить массив или объект?

Nina Scholz 11.04.2018 11:48

@Nina Scholz Я хочу получить массив

Success Man 11.04.2018 11:50

@SuccessMan У вас не может быть массива длиной 5, который имеет элемент в позиции 16. Это не то, как работают массивы.

JJJ 11.04.2018 11:51

Используйте уменьшать и создайте объект вместо массива с идентификатором в качестве ключа.

var clubs = [ 
    {id: 3, name : 'chelsea'},
    {id: 6, name : 'city'},
    {id: 7, name : 'liverpool'},
    {id: 10, name : 'manchester united'},
    {id: 16, name : 'arsenal'}
];
var resData = clubs.reduce((a,x)=>{
 a[x.id] = x;
 return a;
},{})
console.log(resData)

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

Liam MacDonald 11.04.2018 11:41

@Durga Длина должна быть 3. Стоит только 5

Success Man 11.04.2018 11:44

Используйте reduce как Дурга, но передайте объект с геттером как свойство length.

var clubs = [ 
    {id: 3, name : 'chelsea'},
    {id: 6, name : 'city'},
    {id: 7, name : 'liverpool'},
    {id: 10, name : 'manchester united'},
    {id: 16, name : 'arsenal'}
];
var resData = {
    get length(){
        return Object.getOwnPropertyNames(this).filter(function(i){
            return /^\d+$/.test(i)
        }).length
    }
};
clubs.reduce(function(a,x){
    a[x.id] = x;
    return a;
},resData);

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