首页 > 解决方案 > 使用包含每个对象名称的数组创建对象数组

问题描述

我觉得这里离我很近。场景:我在消息中发送了一个 JSON,看起来像这样:

{"objects": {
    "object_name1":{ 
        "name":"object_name1",
        "otherData":"some other data"
    },
    {"object_name2":{ 
        "name":"object_name2",
        "otherData":"some more data"
    }
}}

如您所见,对象不在数组中。我使用Object.keys函数创建了一个包含每个对象的字符串名称的数组,然后使用 if 语句创建了另一个包含我想要的对象的数组,这导致了我当前的问题:

如何使用我创建的数组中包含的字符串值(对象键)创建对象数组?

我试过这样的事情:

filteredKeyArray = ['object_name1','object_name2'];
newObjArray = [];
for(i in filteredKeyArray){
    for(key in objects){
    newObjArray.push(objects[i[key]]);
    }
}

但这newObjArray只是显示所有未定义的。理想情况下,newObjArray显示如下:

[{"object_name1":{...}},{"object_name2":{...}}]

想法?

标签: javascriptarraysobject

解决方案


如果我理解您想要正确执行的操作,您想创建一个包含 objectName 子对象的可迭代数组?

我会这样做,如果你使用数组原型映射函数,你可以在一行代码中使用 Object.keys(target) 遍历对象的所有键并返回你想要的属性(在这种情况下是内部子对象)通过映射作为数组元素。

strangeObject = {
    "objects":{
        "objectName_1":{
            "name":"x",
            "otherData":"some other data"
        },
        "objectName_2":{
            "name":"y",
            "otherData":"some other data"
        }
    }
}
const arrayOfObjects = Object.keys(strangeObject.objects).map(key => strangeObject.objects[key])
console.log(arrayOfObjects)
// logs [ { name: 'x', otherData: 'some other data' },
// { name: 'y', otherData: 'some other data' } ]

映射为您的示例,方法 1

const filteredKeyArray = ['x','y'];
const remappedArray = Object.keys(strangeObject.objects).map((key, i) => { 
    return { [filteredKeyArray[i]] : strangeObject.objects[key]}
})

console.log(remappedArray)
// logs [ { x: { name: 'x', otherData: 'some other data' } },
// { y: { name: 'y', otherData: 'some other data' } } ]

遍历filteredKeyArray,方法2

const filteredIterator = filteredKeyArray.map((key, i) => {
    return { [key]: strangeObject.objects[Object.keys(strangeObject.objects)[i]]}
})

console.log(filteredIterator)
// logs [ { x: { name: 'x', otherData: 'some other data' } },
// { y: { name: 'y', otherData: 'some other data' } } ]

请注意,这些解决方案假定您将在您的 filteredKeyArray 中有一个键来匹配子对象,因为映射迭代,您可能需要添加一个检查来检查 filteredKeyArray 的长度是否比映射迭代器长,或者如果如果使用方法 1,filteredKeyArray[i] 是未定义的。如果使用方法 2,您可能需要在引用 Object.keys(strangeObject.objects)[i] 之前检查未定义,因为您的对象可能少于 fiteredKeyArray 键。


推荐阅读