#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 для глубокого слияния. очень помогло!