尝试创建对象字典时出现语法错误

时间:2021-03-16 20:37:36

标签: javascript

我正在从 API 获取一组对象,如下所示:

[
{
    jobId:100,
    jobName: "Java",
      cities:[
      {
           cityId:10,
           name : "chicago"
      },
      {
         statusId:11,
         name : "miami"
      }]
  },
  {
    jobId:101,
    jobName: "Python",
      cities:[
      {
           cityId:11,
           name : "california"
      },
      {
         cityId:12,
         name : "texas"
      }]
  }
]

我想访问特定工作的城市名称,如下所示:

var jobId = 101;
var cityId = 12;
var texas = jobDict[jobId].cityDict[cityId] // output: texas

代码:

angular.forEach(response.data, function (data) {
        if (jobsDict[data.jobId] == undefined) {
                jobsDict[data.jobId] = [];
        }
        angular.forEach(data.cities, function (city) {
                jobsDict[data.jobId].push({
                    cityDic[city.cityId]: city.name // syntax error here saying unexpected token
                   });
                });
            });

我正在尝试创建工作字典,并在工作字典中创建城市字典。

有人可以帮我解决问题并实现所需的输出吗?

2 个答案:

答案 0 :(得分:1)

您的 jobsDict 是一个数组,因此使用基于 0 的索引,而不是 jobID 键。

对于嵌套的 cities 也是如此。

let jobDict = [{
  jobId: 100,
  jobName: "Java",
  cities: [{
    cityId: 10,
    name: "chicago"
  }, {
    statusId: 11,
    name: "miami"
  }]
}, {
  jobId: 101,
  jobName: "Python",
  cities: [{
    cityId: 11,
    name: "california"
  }, {
    cityId: 12,
    name: "texas"
  }]
}];

let jobId = 101;
let cityId = 12;
let texas =
  jobDict.find(job => job.jobId === jobId)
  .cities.find(city => city.cityId === cityId)
  .name;

console.log(texas);

跟进您的评论,如果您真的很关心性能(除非您有 1000 条条目,否则您不应该如此),以下是将原始结构转换为使用该作业的“字典”结构的方法和城市 ID 作为键:

let jobs = [{
    jobId: 100,
    jobName: "Java",
    cities: [{
        cityId: 10,
        name: "chicago"
    }, {
        cityId: 11,
        name: "miami"
    }]
}, {
    jobId: 101,
    jobName: "Python",
    cities: [{
        cityId: 11,
        name: "california"
    }, {
        cityId: 12,
        name: "texas"
    }]
}];

let jobsById = Object.fromEntries(jobs.map(({jobId, jobName, cities}) =>
        [jobId, {jobName, cities: Object.fromEntries(cities.map(({cityId, name}) => [cityId, name]))}]));

// Equivilant using tradiational for loops.
let jobsById2 = {};
for (job of jobs) {
  let cities = {};
  for (city of job.cities)
    cities[city.cityId] = city.name;
  jobsById2[job.jobId] = {jobName: job.jobName, cities};
}

console.log(jobsById[101].cities[12]);
console.log(jobsById2[101].cities[12]);

答案 1 :(得分:1)

也许是这样的:

const jobArray = [{
    jobId: 100,
    jobName: "Java",
    cities: [{
        cityId: 10,
        name: "chicago"
      },
      {
        cityId: 11,
        name: "miami"
      }
    ]
  },
  {
    jobId: 101,
    jobName: "Python",
    cities: [{
        cityId: 11,
        name: "california"
      },
      {
        cityId: 12,
        name: "texas"
      }
    ]
  }
];

function index_job_array_A(jobArray) {
  return jobArray.reduce(
    (acc, item) => Object.assign(acc, {
      [item.jobId]: Object.assign({}, item, {
        cities: item.cities.reduce(
          (acc, item) => Object.assign(acc, { [item.cityId]: item }),
          {}
        )
      })
    }),
    {}
  );
};

function index_job_array_B(jobArray) {
  let indexed_jobs = {};
  
  jobArray.forEach(function(job) {
    let indexed_cities = {};
    
    job.cities.forEach(function(city) {
      indexed_cities[city.cityId] = city;
    });
    
    indexed_jobs[job.jobId] = { ...job, cities: indexed_cities };
  });

  return indexed_jobs;
};

const jobDictA = index_job_array_A(jobArray);
const jobDictB = index_job_array_B(jobArray);

console.log(jobDictA['100'].cities['10']);
console.log(jobDictB['100'].cities['10']);