Как я могу упорядочить JSON-данные массива без повторяющихся операторов

#javascript #node.js #sorting

#javascript #node.js #сортировка

Вопрос:

Прежде всего, извините за мой плохой английский и спасибо, что нажали на этот вопрос.

У меня есть необработанные данные, такие как

яблоко-красное, банан-желтый, киви-зеленый, виноград-фиолетовый, яблоко-кислое, банан-сладкий…

и я хочу создать данные JSON с этими необработанными данными, например

 [
 {
  apple : {
   color : "red",
   tastes : "sour"
  }
 },
 {
  banana : {
   color : "yellow",
   tastes : "sweet"
  }
 }, ...
]
 

поэтому я обрезал данные с помощью .split(«-«) и добавил элемент JSON в пустой массив с повторяющимися операторами (используя for).

но мой результат выглядит так

 [
 {
  apple : {
  color : "red"
  }
 },
 {
  apple : {
   tastes : "sour"
  }
 },
 {
  banana : {
   color : "yellow"
  }
 }, 
 {
  banana : {
   tastes : "sweet"
 }
}, 
...
]
 

Существует только несколько цветовых (красный, желтый, зеленый ..) атрибутов и вкусов (кислый, сладкий, острый …)
так что, может быть, я смогу справиться с этим условием if.

но моя проблема в том, что слишком много повторяющихся операторов для проверки ключа элемента массива.

Я должен проверить наличие «яблока» во всех элементах массива, а затем я могу добавить другие атрибуты.

Как я могу это решить?

Ответ №1:

вы должны использовать карту для группировки фруктов и проверить, соответствует ли значение определенному атрибуту, и установить значение в правильном свойстве, как в этом примере:

 function arrangeFruits(str) {
  const map = {};
  const colors = ['red', 'yellow', 'green', 'purple'];
  const tastes = ['sour', 'sweet'];
  const parts = str.split(',');

  parts.forEach((item) => {
    const [index, attr] = item.split('-');
    if (!map[index]) {
      map[index] = {};
    }

    if (colors.includes(attr)) {
      map[index].color = attr;
    } else if (tastes.includes(attr)) {
      map[index].tastes = attr;
    }
  });

  const fruits = [];
  for (const item in map) {
    const fruit = {};
    fruit[item] = map[item];
    fruits.push(fruit);
  }
  return fruits;
}

const result = arrangeFruits(
  'apple-red,banana-yellow,kiwi-green,grape-purple,apple-sour,banana-sweet'
);
console.log(JSON.stringify(result)); 

Ответ №2:

Предполагая, что у вас уже есть объект

 $currentObject = {
  apple : {
  color : "red"
  }
 };
$newObject  = {
  apple : {
   tastes : "sour"
  }
 };
 

Вы можете попробовать использовать слияние Lodash в соответствии с документацией здесь:https://lodash.com/docs/4.17.15#merge чтобы глубоко объединить ваш объект в один.

 _.merge($currentObject, $newObject);
 

Комментарии:

1. Спасибо за ваш ответ, и я нашел модуль ‘deepmerge’ на узле. Похоже на Lodash для глубокого слияния. очень помогло!