Преобразование данных JSON в массив Javascript в нокауте

#javascript #arrays #json #knockout.js

#javascript #массивы #json #knockout.js

Вопрос:

У меня есть следующий массив JSON:

 AccessToFinancialServicesRule: {Clean: 3, Copy: 3}
BoardParticipationRule: {Clean: 3, Copy: 3}
Documents: null
EconomicDevelopmentRule: {Clean: 3, Copy: 3}
EmployeeStructureRule: {Clean: 3, Copy: 3}
EmpowermentFinanceRule: {Clean: 3, Copy: 3}
EnterpriseDevelopmentRule: {Clean: 3, Copy: 3}
OwnershipRule: {Clean: 3, Copy: 3}
PreferentialProcurementRule: {Clean: 3, Copy: 3}
ResponsibleSocialMarketingRule: {Clean: 3, Copy: 3}
SkillsDevelopmentRule: {Clean: 3, Copy: 3}
SocioEconomicDevelopmentRule: {Clean: 3, Copy: 3}
SupplierDevelopmentRule: {Clean: 3, Copy: 3}
  

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

 0: {label: "Ownership", clean: 3, copy: 3}
1: {label: "Skills<br>Development", clean: 3, copy: 3}
2: {label: "Localisation", clean: 3, copy: 3}
3: {label: "Socio-Economic<br>Development", clean: 3, copy: 3}
4: {label: "Board Participation", clean: 3, copy: 3}
5: {label: "Employee Structure", clean: 3, copy: 3}
6: {label: "Preferential Procurement", clean: 3, copy: 3}
7: {label: "Enterprise Development", clean: 3, copy: 3}
8: {label: "Supplier Development", clean: 3, copy: 3}
  

где каждый элемент вызывается label и показывает clean и copy

Я попробовал следующее:

 var allItems = [data.Mappings];
            var testData = allItems.map(function(item){
                return {
                'label': item,
                'clean': item.Clean,
                'copy':item.Copy 
            };
            });

            console.log(testData)
  

но это, похоже, не работает, это превращает все в один объект, подобный этому:

 0:
clean: undefined
copy: undefined
label: {OwnershipRule: {…}, BoardParticipationRule: {…}, SkillsDevelopmentRule: {…}, EmployeeStructureRule: {…}, PreferentialProcurementRule: {…}, …}
  

Что я делаю не так?

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

1. Ваши данные не в массиве, вы имели в виду, что это массив объектов?

2. @netizen да, массив объекта

Ответ №1:

Вам нужно использовать Object.keys для доступа к свойствам в объектах вот пример:

 const convertToArray = array.map((item) => {
  const key = Object.keys(item)

  if (item[key]) {
    return {
      label: key[0],
      clean: item[key].Clean,
      copy: item[key].Copy
    }
  }
})
  

Проверьте ссылку для полного примера: https://jsfiddle.net/qgwxbuem /

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

1. Object.keys возвращает массив, добавьте [0] или .shift()

2. Теперь это работает, хотя я бы поставил его на присвоение ключу, потому что следующая строка все еще проверяет массив