Создание массива объектов с использованием массива имени каждого объекта - PullRequest
0 голосов
/ 30 декабря 2018

Я чувствую дразнящую близость здесь.Сценарий: мне отправляется 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":{...}}]

Мысли?

1 Ответ

0 голосов
/ 30 декабря 2018

Если я понимаю, что вы хотите сделать правильно, вы хотите создать итеративный массив, содержащий дочерние объекты objectName?

Я бы сделал это, как показано ниже, если вы используете функцию карты прототипа массива, вы можете водна строка кода перебирает все ключи объекта, используя Object.keys (target) и возвращает требуемые свойства (в данном случае внутренние дочерние объекты) в качестве элементов массива через map.

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' } ]

mappedкак в вашем примере, метод 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' } } ]

итерирование по фильтру FilterKeyArray, метод 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' } } ]

Обратите внимание, что в этих решениях предполагается, что в вашем фильтре FilterKeyArray будет ключ, соответствующий дочернему элементуЕсли объект итерируется по карте, вы можете добавить проверку, чтобы проверить, больше ли длина фильтруемого массива, чем итератор карты, или если значение FilterKeyArray [i] не определено при использовании метода 1. Если вы используете метод два, вам может понадобитьсяпроверить неопределенность, прежде чем ссылаться на Object.keys (irdObject.objects) [i], так как у вас может быть меньше объектов, которыеfiteredKeyArray keys.

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