对象数组与对象对象之间的搜索功能问题

时间:2018-12-12 08:51:48

标签: javascript arrays javascript-objects

我有一个要搜索的数据库,但是当制作一个新的,更大的数据库时,格式更改了。我想将新格式重新格式化为旧格式,但不知道如何。这是我的情况。

我有这个对象数组:

let people = [{"name": "John", "country": "England", "hair": "brown"},
              {"name": "Jenny", "country": "Scotland", "hair": "black"}]

新数组如下:

let newPeople = [{
                  "John": {"country": "England", "hair": "brown"},
                  "Jenny": {"country": "Scotland", "hair": "black"}
                }]

我有一个people数组的搜索功能,其工作原理如下:

function getCountry(name) {
    for (let i = 0; i < people.length; i++) {
        if (name === people[i].name) {
            return people[i].country;
        }
    }
}

最适合的地方:

getCountry("Jenny") // returns "Scotland"

现在,在“ newPeople”数组中,要获取詹妮的所在国家,我必须写:

newPeople[0].Jenny["country"]

这令人难以置信,尤其是因为每个人都是newPeople [0]的一部分,而不是每个人的数字增加1。而且我确定可能缺少一种方法,但是我不能使用相同的for循环,也不能通过“名称”匹配搜索到的术语,因为对象没有“名称”属性从旧的“人”阵列中删除。

无论如何,我可以简单地将新数组转换为具有旧格式的数组吗?如果是这样,我将对整个数据库执行此操作,而不是使用新格式。

1 个答案:

答案 0 :(得分:0)

如果要迭代,可以使用Object.keys(newPeople)。它返回带有“ newPeople”键的数组。在这种情况下,数组将为[“ John”,“ Jenny”]。

但是要实现您的目标,您可以(如果响应始终是只有一个对象的数组,就像您发布的对象一样)

function getCountry(name) {
  return newPeople[0][name].country;
}

如果数组并不总是包含单个对象中的所有名称,则必须像以前一样进行迭代:

function getCountry(name) {
    for (let i = 0; i < people.length; i++) {
        if (name in people[i]) {
            return people[i][name].country;
        }
    }
}