#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"
}
}
Итак, в основном категория была удалена.
Как я могу заставить его работать с моей новой структурой объекта?
Предполагается, что код получит все доступные имена тегов, затем удалит дубликаты и, наконец, добавит результат в массив
Комментарии:
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) . Я привел ссылку на него ниже, а также на массивы.
Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать.
Ссылки:
Комментарии:
1. Почему вы используете
$(document).ready()
функцию in, которая не использует DOM?2. @Barmarэто часть кода OP в скрипке, которую он настроил.
3. Извините, но в консоли нет результата. Код должен получить все доступные имена тегов, затем удалить дубликаты и, наконец, добавить результат в массив
4. @MarkcccAppellido В консоли есть результат, он находится под заданным объектом. Если вы хотите видеть результаты конкретно, вы можете записать results.values() или, если они вам действительно нравятся в формате массива, вы можете перебирать их и добавлять в массив, используя шаблон, подобный этому: jsfiddle.net/hy46u7ey — однако на данном этапе я бы ожидал, что вы будете искатьответьте и попытайтесь решить проблему, с которой вы столкнулись, прежде чем задавать дальнейшие вопросы.
5. Извините, я просто получаю «Set {}» в качестве результата. Ожидаемый результат будет [«tag1», «tag2»]