Создать новый объект, используя ключи и значения из другого объекта
Я сохраняю объект в состоянии, которое выглядит так:
ingredients: {
salad: {
amount: 3,
basePrice: 1
},
cheese: {
amount: 2,
basePrice: 1.2
}
}
Я хочу использовать это в состоянии моего компонента следующим образом
ingredients: {
salad: 3,
cheese: 2
}
я использовал Object.keys
а также map
сначала, но он возвращает массив пар ключ-значение вместо объектов.
Хотя это работает:
const newIngredientsObject = {};
for (const i in ingredientsObject)
newIngredientsObject[i] = ingredientsObject[i].amount;
return newIngredientsObject;
Я хочу найти решение без вспомогательного метода, как таковой:
const mapStateToProps = state => {
return {
ingredients: Object.keys(state.burger.ingredients).map(i => (
{ [i]: state.burger.ingredients[i].amount } )),
totalPrice: state.burger.totalPrice
}
};
5 ответов
ОТВЕТ: Спасибо за решения, предоставленные ibrahim tanyalcin и Nina Scholz
- Уменьшить функцию:
Object.keys(ingredients)
.map( (d, i) => [d, ingredients[d].amount])
.reduce( (ac, d, i) => (ac[d[0]] = d[1], ac), {} );
- Функция записи:
Object.assign(...Object.entries(ingredients)
.map( ([key, value]) => ({ [key]: value.amount }) ) );
reduce: 0.0849609375ms
entries: 0.1650390625ms
forLoop: 0.07421875ms
reduce: 0.024169921875ms
entries: 0.048095703125ms
forLoop: 0.010009765625ms
reduce: 0.010009765625ms
entries: 0.016845703125ms
forLoop: 0.0078125ms
После некоторого тестирования кажется, что использование цикла for является наиболее эффективным, а после этого - функцией Reduce.
Вы можете отобразить записи объекта, используя amount
Свойство значений и принять Object.assign
для получения нового объекта.
var ingredients = { salad: { amount: 3, basePrice: 1 }, cheese: { amount: 2, basePrice: 1.2 } },
result = Object.assign(
...Object.entries(ingredients).map(([key, value]) => ({ [key]: value.amount }))
);
console.log(result);
Вы попросили решение с Object.keys, вот один:
var x = {ingredients: {
salad: {
amount: 3,
basePrice: 1
},
cheese: {
amount: 2,
basePrice: 1.2
}
}}
Object.keys(x.ingredients).map((d,i)=>[d,x.ingredients[d].amount]).reduce((ac,d,i)=>(ac[d[0]]=d[1],ac),{})
//{salad: 3, cheese: 2}
Когда вы хотите создать один объект внутри другого, перейдите в этот веб
object 1 = {
content 1 = {
stuff = {
},
more Stuff = {
}
}
} объект 2 = {ключ 1:"", ключ 2: ""
} объект 1.содержание 1 = объект 2;
Самое короткое, что я мог придумать, используя Object.keys
а также reduce
const ingredients = {
salad: {
amount: 3,
basePrice: 1
},
cheese: {
amount: 2,
basePrice: 1.2
}
};
let newObject = Object.keys(ingredients).reduce((acc, val) => {
acc[val] = ingredients[val].amount;
return acc;
}, {});
console.log(newObject);