Search code examples
javascriptarraysobjectjavascript-objects

New array of objects, but with changed keys


I have a problem with picking some data with array of objects and pushing it into new object (in different array), but in different way.

const fruits = [
{name: "apple"},
{name: "kiwi"},
{name: "banana"},
{name: "orange"},
{name: "pineapple"},
{name: "coconut"},
{name: "peach"}, 
{name: "lemon"}
]

I want to pick a few items from this and paste them into completely new array, so it could look like this:

const manyFruits = [
{name: "apple-banana-kiwi-coconut"},
{name: "orange-pineapple-peach-lemon"}]

It would be great to do a function which takes an argument of how many fruits we want to pick into new array and they shouldn't repeat.

Below is my code. Firstly I create new array with names, then I push them into new array which depends on "length" and finally I try to create new array with objects, but it fails.

const fruitArray = length => {


const fruits = [
    {name: "apple"},
    {name: "kiwi"},
    {name: "banana"},
    {name: "orange"},
    {name: "pineapple"},
    {name: "coconut"},
    {name: "peach"},
    {name: "lemon"}
]

const allFruits = []

for (let i = 0; i < fruits.length; i++) {
    allFruits.push(fruits[i].name)
}

const newFruits =[]

for (let i = 0; i < length; i++) {
    newFruits.push(allFruits[i])
}

const manyFruitsInOneArr = []

for (let i = 0; i < 2; i++) {
    let newArr = {
        name: newFruits.join("-"),
    }

    manyFruitsInOneArr[i] = (newArr)
}

console.log(manyFruitsInOneArr)

}
fruitArray(2)

It generates new objects in new array, but items are the same all the time.


Solution

  • You can create function for this using for loop and inside map() method to get array of names and join() to make a string from values.

    const fruits = [{"name":"apple"},{"name":"kiwi"},{"name":"banana"},{"name":"orange"},{"name":"pineapple"},{"name":"coconut"},{"name":"peach"},{"name":"lemon"}]
    
    const pick = (arr, n) => {
      const r = [];
      for (var i = 0; i < arr.length; i += n) {
        const name = arr
          .slice(i, i + n)
          .map(({name}) => name)
          .join('-');
    
        r.push({name})
      }
      return r;
    }
    
    const result = pick(fruits, 2)
    console.log(result)

    Update: to get names and sum of energy for each slice you can use map() and reduce() methods.

     fruits = [ {name: "apple", energy: 100}, {name: "kiwi", energy: 126}, {name: "banana", energy: 150}, {name: "orange", energy: 118}, {name: "pineapple", energy: 98}, {name: "coconut", energy: 83}, {name: "peach", energy: 65}, {name: "lemon", energy: 36} ] 
    
    const pick = (arr, n) => {
      const r = [];
      for (var i = 0; i < arr.length; i += n) {
        const slice = arr.slice(i, i+n);
        const name = slice.map(({name}) => name).join('-')
        const energy = slice.reduce((r, {energy}) => r + energy, 0);
        r.push({name, energy})
      }
      return r;
    }
    
    const result = pick(fruits, 2)
    console.log(result)