Превращение массива в хеш, затем добавление значения ключа => и приращение при наличии ключа - PullRequest
0 голосов
/ 02 июля 2019

После повторной попытки я думаю, что для этого потребуется каждый метод с do..end.Ниже вы увидите всю спецификацию теста, чтобы дать вам разбивку того, на что переводится «корзина», и я пока включил свой код вместе с ошибками.

Корзина начинается как массив отдельных элементов.Переведите его в хеш, который включает в себя счет для каждого элемента с помощью метода consolidate_cart.

describe "Grocer" do
  let(:items) do
    [
      {"AVOCADO" => {:price => 3.00, :clearance => true}},
      {"KALE" => {:price => 3.00, :clearance => false}},
      {"BLACK_BEANS" => {:price => 2.50, :clearance => false}},
      {"ALMONDS" => {:price => 9.00, :clearance => false}},
      {"TEMPEH" => {:price => 3.00, :clearance => true}},
      {"CHEESE" => {:price => 6.50, :clearance => false}},
      {"BEER" => {:price => 13.00, :clearance => false}},
      {"PEANUTBUTTER" => {:price => 3.00, :clearance => true}},
      {"BEETS" => {:price => 2.50, :clearance => false}},
      {"SOY MILK" => {:price => 4.50, :clearance => true}}
    ]
  end

  let(:coupons) do
    [
      {:item => "AVOCADO", :num => 2, :cost => 5.00},
      {:item => "BEER", :num => 2, :cost => 20.00},
      {:item => "CHEESE", :num => 3, :cost => 15.00}
    ]
  end

  describe "#consolidate_cart" do
    it "adds a count of one to each item when there are no duplicates" do
      cart = [find_item('TEMPEH'), find_item('PEANUTBUTTER'), find_item('ALMONDS')]
      result = consolidate_cart(cart)
      result.each do |item, attributes|
        expect(attributes.keys).to include(:count)
        expect(attributes[:count]).to eq(1)
      end
    end

    it "increments count when there are multiple items" do
      avocado = find_item('AVOCADO')
      cart = [avocado, avocado, find_item('KALE')]

      result = consolidate_cart(cart)
      expect(result["AVOCADO"][:price]).to eq(3.00)
      expect(result["AVOCADO"][:clearance]).to eq(true)
      expect(result["AVOCADO"][:count]).to eq(2)

      expect(result["KALE"][:price]).to eq(3.00)
      expect(result["KALE"][:clearance]).to eq(false)
      expect(result["KALE"][:count]).to eq(1)
    end
  end

Вот что я сделал до сих пор:

def consolidate_cart(cart)

  newCart = {}

  cart.each do |item| 

    if cart[item.keys[0]]
        cart[item.keys[0]][:count] += 1;
    else
      cart[item[0]]
      #need to use values method to get the price and clearence added.
      binding.pry
    end
    newCart[cart]
  end
end

Я получаю следующую ошибку:

  1) Grocer #consolidate_cart adds a count of one to each item when there are no duplicates
     Failure/Error: result = consolidate_cart(cart)

     TypeError:
       no implicit conversion of String into Integer
     # ./grocer.rb:7:in `block in consolidate_cart'
     # ./grocer.rb:5:in `each'
     # ./grocer.rb:5:in `consolidate_cart'
     # ./spec/grocer_spec.rb:28:in `block (3 levels) in <top (required)>''

Я действительно мог бы использовать объяснение / помощь.Я не могу заставить свою работу по-настоящему взглянуть на каждый кусочек ода в отдельности.

1 Ответ

0 голосов
/ 06 июля 2019

def consolidate_cart (корзина) # корзина представляет собой массив хэшей newCart = {}

cart.each do | k |

if newCart[k.keys[0]]
  newCart[k.keys[0]][:count] += 1
else
  newCart[k.keys[0]] = k[k.keys[0]]
  newCart[k.keys[0]][:count] = 1
end

конец newCart конец

...