реагировать javascript - json как объединить несколько элементов массива в одну строку - PullRequest
0 голосов
/ 30 марта 2020

У меня есть ответ JSON, как показано ниже:

[{
    "id": 1,
    "food": {
      "fruits": ["Banana", "Orange", "Apple", "Mango"],
      "veggies": ["greens", "peppers", "carrot", "potatoes"],
    }
  },
  {
    "id": 2,
    "food": {
      "fruits": ["grapes", "berries", "peach", "pears"],
      "veggies": ["cabbage", "spinach"],
      "dairy": ["nutmilk", "goatmilk"]
    }
  }
]

Теперь я хочу объединить массивы каждого «id» (например, 1,2) в строку (с разделителями), как показано ниже:

id_1 = Banana;Orange;Apple;Mango;greens;peppers;carrot;potatoes

// observer "id_2" has additional array - "dairy"

id_2 = grapes;berries;peach;pears;cabbage;spinach;nutmilk;goatmilk

Ключи являются динамическими c, поэтому для некоторых записей есть 2 массива, а для некоторых записей это может быть 3 или 4, а может быть 1.

Я пытался использовать реагировать / Java Сценарий Array.concat(), но я не уверен, как это сделать динамически. Пожалуйста, помогите мне. Спасибо.

Ответы [ 4 ]

3 голосов
/ 30 марта 2020

Это легко сделать с помощью Object.values().flat().join(';'), показанного ниже:

let arr=[{"id":1,"food":{"fruits":["Banana","Orange","Apple","Mango"],"veggies":["greens","peppers","carrot","potatoes"],}},{"id":2,"food":{"fruits":["grapes","berries","peach","pears"],"veggies":["cabbage","spinach"],"dairy":["nutmilk","goatmilk"]}}];
const result = arr.map(({id,food}) => ({id, food: Object.values(food).flat().join(';')}));
console.log(result);

Вы можете легко реструктурировать вывод, просто изменив его, например, на ["id_"+id]: Object.values(...)

1 голос
/ 30 марта 2020

Первое выравнивание с использованием map, flat и join. Затем преобразуйте полученный массив объектов в один объект, используя assign.

var db = [{"id": 1,"food": {"fruits": ["Banana", "Orange", "Apple", "Mango"], "veggies": ["greens","peppers","carrot","potatoes"], }},{"id" : 2,"food": {"fruits": ["grapes", "berries", "peach", "pears" ], "veggies": ["cabbage","spinach"], "dairy": ["nutmilk","goatmilk"]}}];

var flat = db.map(
  ({id, food}) => ({[`id_${id}`]: Object.values(food).flat().join(';')})
);
var result = Object.assign(...flat);
console.log(result);
0 голосов
/ 30 марта 2020

Попробуйте, используя basi c для l oop. Внутри вы будете вычислять ключ динамически, а значение будет сведено в массив Object.values ​​итерируемого объекта.

var input = [{
    id: 1,
    food: {
        fruits: ["Banana", "Orange", "Apple", "Mango"],
        veggies: ["greens", "peppers", "carrot", "potatoes"]
    }
},
{
    id: 2,
    food: {
        fruits: ["grapes", "berries", "peach", "pears"],
        veggies: ["cabbage", "spinach"],
        dairy: ["nutmilk", "goatmilk"]
    }
}
];

var temp = [];
for (var i = 0; i < input.length; i++) {
temp.push({
    [`id_${input[i].id}`]: Object.values(input[i].food)
        .flat(1)
        .join(";")
});
}
console.log(temp); // this gives you an array
console.log(Object.assign(...temp));// in case you require one single object
0 голосов
/ 30 марта 2020

Это на самом деле две проблемы: цикл по массиву объектов для объединения их в один объект и цикл по объекту для объединения всего его массива.

Сначала разбираемся со вторым, что-то вроде этого работа:

const concatArraysInObject = obj => 
  Object.values(obj).reduce((result, arr) => result.concat(arr), []);

const input = { a: [1,2,3], b: [4,5,6], c: [7,8,9] };
const output = concatArraysInObject(input);
console.log(output);

Object.values() даст вам массив всех массивов в объекте.

Функция reduce() принимает два параметра: функцию и начальную значение.

Функция также должна принимать (как минимум) 2 параметра: результат последнего вызова (или начальное значение) и текущее значение в массиве.

Это вызовет функция один раз для каждого элемента в массиве.

Теперь, когда это решено, мы можем решить первую проблему.

Для этого мы также можем использовать reduce(), и мы ' Построим наш комбинированный объект при каждом вызове.

const concatArraysInObject = (obj) => 
  Object.values(obj).reduce((result, arr) => result.concat(arr), []);
  
const mergeObjectsInArray = (arr, dataKey) =>
  arr.reduce((result, obj) => ({ ...result, [obj.id]: concatArraysInObject(obj[dataKey]) }), {});
  
const input = [
  { id: 'A', data: { a: [1,2,3], b: [4,5,6] } },
  { id: 'B', data: { c: [7,8,9], d: [10,11,12] } }
];

const output = mergeObjectsInArray(input, 'data');
console.log(output);

Важное предупреждение: порядок ключей объекта НЕ гарантируется в JavaScript. Хотя в 99% случаев они будут в том порядке, в котором вы ожидаете, это не является гарантией, поэтому, если вы зависите от порядка ключей для порядка массива (если порядок имеет значение), вы захотите изменить свой структура ввода. Если порядок не имеет значения, вероятно, все в порядке.

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