Функция Array Map не может обработать объект * * * в простом примере - PullRequest
2 голосов
/ 14 апреля 2020

Я получил данные, где в массиве я получил набор объектов (с ключами страны и состояния вместе со значениями).

Теперь мне нужно отформатировать данные таким образом, чтобы я получил новый массив (с указанием названия страны в качестве ключа и списка состояний в массиве в качестве значений).

Я пытаюсь это сделать, но безуспешно. Кто-нибудь может мне помочь?

var data = [
    {
        "country": "United States",
        "states": [
            "Alabama",
            "Alaska",
            "Arizona",
        ]
    },
    {
        "country": "Canada",
        "states": [
            "Ontario",
            "Saskatchewan",
            "Alberta",
        ]
    },
    {
        "country": "Australia",
        "states": [
            "Australian Capital Territory",
            "Jervis Bay Territory",
            "New South Wales",
            "Queensland",
        ]
    }
];

newData = []; 
data.map(item => newData.push({item.country: item.states});
console.log(newData);

Ответы [ 5 ]

3 голосов
/ 14 апреля 2020

Это потому, что ключ объекта с точкой не является допустимым синтаксисом. Вы можете решить эту проблему, обернув ключ []. Также метод .map() создает новый массив, заполненный результатами вызова предоставленной функции для каждого элемента в вызывающем массиве. Таким образом, вы должны использовать метод .forEach(), например:

data.forEach(item => newData.push({[item.country]: item.states})); 

var data=[{country:"United States",states:["Alabama","Alaska","Arizona"]},{country:"Canada",states:["Ontario","Saskatchewan","Alberta"]},{country:"Australia",states:["Australian Capital Territory","Jervis Bay Territory","New South Wales","Queensland"]}];

var newData = []; 
data.forEach(item => newData.push({[item.country]: item.states}));
console.log(newData);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Или, вы можете использовать метод .map() и просто вернуть объект внутри обратного вызова .map() и сохранить его в newData как:

 newData = data.map(item => ({[item.country]: item.states}));

var data=[{country:"United States",states:["Alabama","Alaska","Arizona"]},{country:"Canada",states:["Ontario","Saskatchewan","Alberta"]},{country:"Australia",states:["Australian Capital Territory","Jervis Bay Territory","New South Wales","Queensland"]}]

var newData = data.map(item => ({[item.country]: item.states}));
console.log(newData);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 14 апреля 2020

Правильное использование map - возвращать значение в методе карты, которого нет в вашем коде. Помимо этого используйте деструктуру для дальнейшего упрощения.

const newData = data.map(({country, states}) => ({[country]: states}));

var data = [
    {
        "country": "United States",
        "states": [
            "Alabama",
            "Alaska",
            "Arizona",
        ]
    },
    {
        "country": "Canada",
        "states": [
            "Ontario",
            "Saskatchewan",
            "Alberta",
        ]
    },
    {
        "country": "Australia",
        "states": [
            "Australian Capital Territory",
            "Jervis Bay Territory",
            "New South Wales",
            "Queensland",
        ]
    }
];

const newData = data.map(({country, states}) => ({[country]: states}));
console.log(newData);
0 голосов
/ 14 апреля 2020

let arr = []
array.forEach(element => {
  arr.push({key:element.country, value: element.state})
}

**, если вы используете карту, пожалуйста, вернитесь, но я думаю, что вы используете forEach в таком случае

0 голосов
/ 14 апреля 2020

Вы можете попробовать это:
Он хорошо работает с вашими требованиями.

data.forEach(item => {
    const obj = new Object();
    obj[item.country] = item.states;
    newData.push(obj)
});

Здесь мы используем ключевое слово new для объявления нашего объекта и просто помещаем объект в наш массив. Кроме того, поскольку country является переменной, поэтому мы используем нотацию [], а не нотацию dot.

0 голосов
/ 14 апреля 2020

Попробуй вот так.

var data = [
    {
        "country": "United States",
        "states": [
            "Alabama",
            "Alaska",
            "Arizona",
        ]
    },
    {
        "country": "Canada",
        "states": [
            "Ontario",
            "Saskatchewan",
            "Alberta",
        ]
    },
    {
        "country": "Australia",
        "states": [
            "Australian Capital Territory",
            "Jervis Bay Territory",
            "New South Wales",
            "Queensland",
        ]
    }
];


let newData = data.map(item => { return { [item.country] : [...item.states]}})
console.log(newData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...