Создать новый объект, используя ключи и значения из другого объекта - PullRequest
0 голосов
/ 18 мая 2018

Я сохраняю объект в состоянии, которое выглядит следующим образом:

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 ]

0 голосов
/ 18 мая 2018

ОТВЕТ : Спасибо за решения, предоставленные @ ibowankenobi и @ Нина Шольц

  • Функция уменьшения:

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.

0 голосов
/ 18 мая 2018

Самое короткое, что я мог придумать, используя 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);
0 голосов
/ 18 мая 2018

когда вы хотите создать один объект внутри другого, зайдите в этот веб

object 1  = {
content 1 = {
    stuff = {
    },
    more Stuff = {
    }
}

} объект 2 = {ключ 1: "", ключ 2: ""

} объект1.содержание 1 = объект 2;

0 голосов
/ 18 мая 2018

Вы задали решение с помощью 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}
0 голосов
/ 18 мая 2018

Вы можете отобразить записи объекта, используя свойство 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);
...