Значение не вводится в пару ключ-значение в угловых - PullRequest
0 голосов
/ 25 мая 2018

У меня есть файл json:

var records= 
[
    {
        "category" : "chinese",
        "name": "noodles"
    },
    {
        "category" : "chinese",
        "name": "veg"  
    },
    {
        "category" : "Indian",
        "name": "Dal"  
    },
    {
        "category" : "Indian",
        "name": "Rajma"  
    },
    {
        "category" : "chinese",
        "name": "chicken"  
    },
    {
        "category" : "continental",
        "name": "fish"
    },
    {
        "category" : "continental",
        "name": "Veg"
    },
    {
        "category" : "Indian",
        "name": "Paratha" 
    }
]

Я пытаюсь преобразовать этот JSON в следующий формат:

var newcat = 
{
   "chinese": [
               { "name": "noodles", "category": "chinese" },
               {"name": "veg", "category": "chinese"}, 
               {"name":"chicken", "category": "chinese"}
            ], 
   "indian":  [
               { "name": "Dal", "category": "indian" },
               {"name": "rajma", "category": "indian"}, 
               {"name":"chicken", "category": "indian" }
            ], 
  "continental": [
                 { "name": "fish", "category": "continental" },
                 { "name": "veg", "category": "continental"} 

            ] 
}

Код, который я использую в угловом формате:

var newcat={}
            var arr= {}
            var isPresent= false;
            var cat
            for (let i=0;i< records.length;i++) {
                cat= records[i].category
                for(let item in newcat) {
                    if(cat == item) {
                        isPresent= true
                    }
                    else {
                            isPresent= false
                    }
                }
                if(isPresent== false){
                    newcat[cat]= []
                }
                else {
                    newcat[cat].push(records[i])
                    console.log("===>",newcat)
                }

            }

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

Результат должен выглядеть следующим образом на console.log:

{chinese: Array(3), indian: Array(3), continental: Array(2)}

Вместо этого он выглядит так:

{chinese: Array(0), indian: Array(1), continental: Array(1)}

Я не мог понять, почему всеэлементы не входят

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Если вы используете ecmascript-6 в качестве тега, у вас должен быть доступ к оператору распространения без необходимости использования Lodash:

По сути, это должно сделать всю работу за вас:

records.map(item => {
    newcat[item.category.toLowerCase()] = newcat[item.category.toLowerCase()] || []
    newcat[item.category.toLowerCase()] = [
        ...newcat[item.category.toLowerCase()],
        { ...item }
    ] 
})

Рабочий фрагмент ниже:

var records = [{
    "category": "chinese",
    "name": "noodles"
  },
  {
    "category": "chinese",
    "name": "veg"
  },
  {
    "category": "Indian",
    "name": "Dal"
  },
  {
    "category": "Indian",
    "name": "Rajma"
  },
  {
    "category": "chinese",
    "name": "chicken"
  },
  {
    "category": "continental",
    "name": "fish"
  },
  {
    "category": "continental",
    "name": "Veg"
  },
  {
    "category": "Indian",
    "name": "Paratha"
  }
]

var newcat = {}

records.map(item => {
  newcat[item.category.toLowerCase()] = newcat[item.category.toLowerCase()] || []
  newcat[item.category.toLowerCase()] = [
    ...newcat[item.category.toLowerCase()],
    { ...item }
  ]
})

console.log(newcat)
0 голосов
/ 25 мая 2018

Если вы уже используете Lodash, используйте _.groupBy.В противном случае вы можете написать свою собственную функцию groupBy:

var records = [
    {
        "category" : "chinese",
        "name": "noodles"
    },
    {
        "category" : "chinese",
        "name": "veg"  
    },
    {
        "category" : "Indian",
        "name": "Dal"  
    },
    {
        "category" : "Indian",
        "name": "Rajma"  
    },
    {
        "category" : "chinese",
        "name": "chicken"  
    },
    {
        "category" : "continental",
        "name": "fish"
    },
    {
        "category" : "continental",
        "name": "Veg"
    },
    {
        "category" : "Indian",
        "name": "Paratha" 
    }
];

function groupBy(array, key) {
  return array.reduce((groups, value) => {
    const group = groups[value[key]] || (groups[value[key]] = []);
    group.push(value);
    return groups;
  }, {});
}

console.log(groupBy(records, 'category'));

В качестве альтернативы вместо reduce используется петля for:

function groupBy(array, key) {
  const groups = {};
  for(let i = 0; i < array.length; i++) {
    const value = array[i];
    const valueKey = value[key];
    if(!groups[valueKey]) groups[valueKey] = [];
    groups[valueKey].push(value);
  }
  return groups;
}

РЕДАКТИРОВАТЬ: Исправление существующего кода:

Ваша реализация имеет две проблемы.Во-первых, цикл for/in, который устанавливает isPresent, не break после того, как он находит совпадение.Во-вторых, оператор else в конце заставляет не перемещать первый элемент в категории, потому что все, что вы делаете, - это создаете пустой массив категорий.Вот это с исправлениями:

var records = [
    {
        "category" : "chinese",
        "name": "noodles"
    },
    {
        "category" : "chinese",
        "name": "veg"  
    },
    {
        "category" : "Indian",
        "name": "Dal"  
    },
    {
        "category" : "Indian",
        "name": "Rajma"  
    },
    {
        "category" : "chinese",
        "name": "chicken"  
    },
    {
        "category" : "continental",
        "name": "fish"
    },
    {
        "category" : "continental",
        "name": "Veg"
    },
    {
        "category" : "Indian",
        "name": "Paratha" 
    }
];


var newcat = {};
var arr = {};
var isPresent = false;
var cat;

for (let i=0; i < records.length; i++) {
    cat= records[i].category
    for(let item in newcat) {
        if(cat == item) {
            isPresent= true
            break;
        }
        else {
            isPresent= false
        }
    }
    if(isPresent== false){
        newcat[cat] = []
    }
    newcat[cat].push(records[i])
}

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