新的对象数组,但更改了键

时间:2018-02-11 12:48:47

标签: javascript arrays object javascript-objects

我在使用对象数组选择一些数据并将其推入新对象(在不同的数组中)时遇到问题,但是以不同的方式。

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

我想从中选择一些项目并将它们粘贴到全新的数组中,所以它看起来像这样:

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

做一个函数可以很好地讨论我们想要选择多少个水果进入新阵列并且不应该重复。

以下是我的代码。首先,我创建了带有名称的新数组,然后我将它们推入新的数组,这取决于" length"最后我尝试用对象创建新数组,但它失败了。

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)

它在新数组中生成新对象,但项目始终相同。

2 个答案:

答案 0 :(得分:2)

您可以使用for循环和map()内部方法为此创建函数以获取名称数组,并使用join()从值创建字符串。

&#13;
&#13;
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)
&#13;
&#13;
&#13;

更新:要获取每个切片的名称和能量总和,您可以使用map()reduce()方法。

&#13;
&#13;
 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)
&#13;
&#13;
&#13;

答案 1 :(得分:1)

可以使用递归来完成:

 function subset(arr, n){
   if(!(n - 1)) return [arr[0].name];
   const result = [];
   for(let i = 0; i < arr.length - n; i++){
       for(const sub of subset(arr.slice(i + 1), n - 1)){
          result.push(arr[i].name + "-" + sub);
       }
   }
   return result;
 }

所以你可以这样做:

 subset(fruits, 5);