#javascript
Вопрос:
Из этого объекта как я могу получить результат, упомянутый ниже?
const obj = {
gopal: [{ height: "164" }, { weight: "75" }, { balance: "500" }],
liton: [{ salary: "20000" }, { balance: "1000" }],
};
Я хочу такого результата:
const newObj = {height: "164", weight: "75", balance: "500", salary: "20000", balance: "1000"}
Моя попытка:
const objc2 = {
gopal: [{
height: "164"
}, {
weight: "75"
}, {
balance: "500"
}],
liton: [{
salary: "20000"
}, {
balance: "1000"
}],
};
function outp(obj) {
const objKeys = Object.keys(obj);
let final = {};
objKeys.forEach((item) => {
let res = {};
obj[item].forEach((item2) => {
res = { ...res,
...item2
};
});
final = { ...final,
[item]: res
};
});
console.log(Object.values(final).reduce(function(result, current) {
return Object.assign(result, current);
}, {}));
}
outp(objc2);
Комментарии:
1. «где повторяющиеся свойства могут повторяться в результирующем объекте» — Ключи в объекте уникальны. У вас не может быть нескольких записей с одним и тем же ключом.
2. Что вы до сих пор пытались решить самостоятельно?
3. хорошо, спасибо. но мне нужны те же самые значения ключей, так как же быть??
4. Может быть, на это можно ответить, если вы скажете, зачем вам это нужно…
5. Вы можете использовать массив для одного и того же ключа.
Ответ №1:
Я знаю, что это не лучший способ сделать это, но это вариант
const obj = {
gopal: [{ height: "164" }, { weight: "75" }, { balance: "500" }],
liton: [{ salary: "20000" }, { balance: "1000" }],
};
let json = JSON.stringify(obj);
let keys = Object.keys(obj);
keys.forEach(k => json = json.replaceAll(`"${k}":`, ""));
json = json.replaceAll(/[[]{}]/g, "");
json = "{" json "}";
console.log(json);
const obj2 = JSON.parse(json);
console.log(obj2);
Комментарии:
1. это потрясающе!! Могу ли я получить доступ к этим дубликатам ключей по отдельности из json?
2. Я так не думаю, вам, вероятно, нужно будет проверить, не является ли это дубликатом, и переименовать его в balance1 и balance2
3. понял. Спасибо.
Ответ №2:
Если вам нравится использовать массив, когда два элемента имеют один и тот же ключ, вы можете сделать что-то вроде:
const input = {
gopal: [{ height: "164" }, { weight: "75" }, { balance: "500" }],
liton: [{ salary: "20000" }, { balance: "1000" }],
};
const output = Object.values(input).flat().reduce((outObj, item) => {
const [key, value] = Object.entries(item)[0];
outObj.hasOwnProperty(key) // if the key is already present
? Array.isArray(outObj[key]) // if the attribute is already an array
? outObj[key].push(value) // push the value in the array
: outObj[key] = [outObj[key], value] // create an array with the current value the new one
: outObj[key] = value; // otherwise add a new key/value pair to the object
return outObj;
}, {});
// test
console.log(output);
Object.values(input)
вернет 2D массив- Затем вы используете
flat()
, чтобы создать массив одного измерения из 2D - Наконец, вы используете
reduce()
цикл по массиву и создаете выходной объект
Затем вы можете получить доступ к значениям «дублированных» ключей с output.key[index]
помощью (например output.balance[0]
)