Javascript изменение кода для чтения измененного объекта

#javascript

#javascript

Вопрос:

У меня есть некоторый код, который уже работает, но мне нужно изменить структуру объекта, и мне нужно изменить код, чтобы он снова работал.

Вот рабочий код (с исходными данными объекта):

 obj = {
    "category": [
        {
            "id": "1",
            "category": "1",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
        {
            "id": "2",
            "category": "1",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
        {
            "id": "3",
            "category": "2",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
        {
            "id": "4",
            "category": "2",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
        {
            "id": "5",
            "category": "3",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
    ]
}

var results = [ ];

for (var i = 0; i < obj.category.length; i  ) {

    $.each( obj.category[i].tags, function( key, value ) {
      results.push(value);
    });

}

var uniqueNames = [];
$.each(results, function(i, el){
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});

console.log(uniqueNames);
  

Теперь мне нужно изменить объект, чтобы он выглядел как эта структура:

 obj = {
        "id": "1",
        "category": "1",
        "tags": {
            "483": "tag1",
            "484": "tag2"
        }
    }
  

JSFiddle

Итак, в основном категория была удалена.

Как я могу заставить его работать с моей новой структурой объекта?

Предполагается, что код получит все доступные имена тегов, затем удалит дубликаты и, наконец, добавит результат в массив

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

1. Похоже, единственное, что изменилось, это то, что вам не нужно перебирать obj.category . Вы сами что-нибудь пробовали?

2. По крайней мере, будьте ясны: дайте нам входной объект и то, что вы ожидаете в качестве вывода

3. Я добавил ссылку jsfiddle, которая показывает проблему

4. Это выглядит просто obj.category[0] . Поскольку это не массив, он не может содержать более одного объекта.

5. Пожалуйста, поместите весь соответствующий код здесь, а не в jsfiddle. Этот вопрос не имеет смысла только для опубликованного кода, поскольку в нем не указано, что вам нужно делать с объектом. Нет необходимости использовать jsfiddle, SO имеет встроенные фрагменты стека.

Ответ №1:

https://jsfiddle.net/qte5oa9g/8/

   $(document).ready(function() {

  objArr = [
        {
            "id": "1",
            "category": "1",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
        {
            "id": "2",
            "category": "1",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
        {
            "id": "3",
            "category": "2",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
        {
            "id": "4",
            "category": "2",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
        {
            "id": "5",
            "category": "3",
            "tags": {
                "483": "tag1",
                "484": "tag2"
            }
        },
    ];


var results = [];

for (var i = 0; i < objArr.length; i  ) {

    $.each( objArr, function( key, value ) {
      (value.tags) ? results.push(value) : false;

    });
    console.log(results);

}

var uniqueNames = [];
$.each(results, function(i, el){
    if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});

console.log(uniqueNames);

}); //onready end
  

Хорошо. Итак, во-первых, может быть, у вас есть какая-то рациональность относительно того, почему, но если вы собираетесь хранить список объектов, я чувствую, что у вас ДОЛЖЕН быть контейнер типа «категории» или хранить их в массиве.

В моем примере я изменил объект на массив объектов.

Оттуда вам просто нужно проверить array.length и установить индекс, который вы проверяете, в массив объектов вместо внутреннего объекта, как у вас было.

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

Вместо того, чтобы нажимать на набор, вы просто используете метод .add(value) . Я привел ссылку на него ниже, а также на массивы.

Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать.

Ссылки:

MDN: Array.prototype

MDN: установить метод добавления прототипа

MDN: объекты JavaScript

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

1. Почему вы используете $(document).ready() функцию in, которая не использует DOM?

2. @Barmarэто часть кода OP в скрипке, которую он настроил.

3. Извините, но в консоли нет результата. Код должен получить все доступные имена тегов, затем удалить дубликаты и, наконец, добавить результат в массив

4. @MarkcccAppellido В консоли есть результат, он находится под заданным объектом. Если вы хотите видеть результаты конкретно, вы можете записать results.values() или, если они вам действительно нравятся в формате массива, вы можете перебирать их и добавлять в массив, используя шаблон, подобный этому: jsfiddle.net/hy46u7ey — однако на данном этапе я бы ожидал, что вы будете искатьответьте и попытайтесь решить проблему, с которой вы столкнулись, прежде чем задавать дальнейшие вопросы.

5. Извините, я просто получаю «Set {}» в качестве результата. Ожидаемый результат будет [«tag1», «tag2»]