根据其对新数组的索引,使用键对对象进行分组

Group objects with keys based on its index to a new array

有谁知道如何根据 Javascript 的索引将数组对象分组到新的对象数组数组中?我对此很陌生,所以我很困在这里

例如我有这个对象:

{
  'first': [
    {
      name: 'jimmy',
      text: 'I love you'
    },
    {
      name: 'jimmy',
      text: 'I miss you!'
    },
    {
      name: 'jimmy',
      text: 'I hate you!'
    }
  ],
  'second': [
    {
      name: 'jeremy',
      text: 'Wow'
    }
  ],
  'third': [
    {
      name: 'john',
      text: 'You ugly'
    },
    {
      name: 'john',
      text: 'You handsome'
    },
    {
      name: 'john',
      text: 'you beautiful'
    }
  ],
 'fourth': [
    {
      name: 'tom',
      text: 'this is cool!'
    },
    {
      name: 'tom',
      text: 'this is hard'
    }
  ]
}

我想将其转换为:

[
  [
    {
      name: 'jimmy',
      text: 'I love you'
    },
    {
      name: 'jeremy',
      text: 'Wow'
    },
    {
      name: 'john',
      text: 'You ugly'
    },
    {
      name: 'tom',
      text: 'this is cool!'
    },
  ],
  [
    {
      name: 'jimmy',
      text: 'I miss you!'
    },
    {
      name: 'john',
      text: 'You handsome'
    },
    {
      name: 'tom',
      text: 'this is hard'
    }
  ],
  [
    {
      name: 'jimmy',
      text: 'I hate you!'
    },
    {
      name: 'john',
      text: 'you beautiful'
    }
  ]
]

所以'first'[1],'second'[1],'third'[1],'fourth'[1]应该分组到第一个数组作为数组对象和 'first'[2]、'second'[2]、'third'[2]、'fourth'[2] 应该作为对象数组转到第二个数组,依此类推..

您可以使用 reduce() 来执行此操作。

const input = {
  first: [
    {
      name: "jimmy",
      text: "I love you",
    },
    {
      name: "jimmy",
      text: "I miss you!",
    },
    {
      name: "jimmy",
      text: "I hate you!",
    },
  ],
  second: [
    {
      name: "jeremy",
      text: "Wow",
    },
  ],
  third: [
    {
      name: "john",
      text: "You ugly",
    },
    {
      name: "john",
      text: "You handsome",
    },
    {
      name: "john",
      text: "you beautiful",
    },
  ],
  fourth: [
    {
      name: "tom",
      text: "this is cool!",
    },
    {
      name: "tom",
      text: "this is hard",
    },
  ],
};

const output = Object.values(input).reduce(
  (all, cur) => (
    cur.forEach((item, idx) =>
      idx < all.length ? all[idx].push(item) : (all[idx] = [item])
    ),
    all
  ),
  []
);
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }

首先,我们不关心 input 对象的键,因此我们可以使用 Object.values() 来获取值。

然后,想法是从一个空数组 allreduce() 的第二个参数)开始,然后遍历 input.

然后对于每个元素 cur 我们遍历这个元素的所有 items 并且对于每个 items 我们检查我们是否有这个元素的索引 (idx) 已经在 all 数组中。

如果我们不这样做,这个索引比之前添加的任何索引都大,我们需要扩展我们的 all 数组以保存该值。由于我们期望给定点有多个值,因此我们需要使用数组作为该点的值。如果给定索引已经有至少一个值,那么在给定索引处已经有一个数组,我们只需要 push() 将新项目添加到 all 数组中。

Mushroomator's 可能是最简洁的方法。

如果您是 JavaScript、函数式编程或整体编程的新手,我认为以下是一种不错的 intro-level 方法,可能更容易理解。

基本逻辑是相同的,只是步骤更加explicit/more明显。

  1. 创建一个 output 数组来保存结果。
  2. 使用 Object.values().[=44= 从 data 中获取 firstsecondthirdfourth 数组]
  3. 对于第 2 步中的每个数组,使用 for 循环迭代它们的项目。
  4. 如果 output 还没有当前索引的嵌套数组,请创建一个。
  5. Array#push() 将当前数组中当前索引处的项放入 output.
  6. 中当前索引处的数组中

const data = {
  first:[{name:"jimmy",text:"I love you"},{name:"jimmy",text:"I miss you!"},{name:"jimmy",text:"I hate you!"}],
  second:[{name:"jeremy",text:"Wow"}],
  third:[{name:"john",text:"You ugly"},{name:"john",text:"You handsome"},{name:"john",text:"you beautiful"}],
  fourth:[{name:"tom",text:"this is cool!"},{name:"tom",text:"this is hard"}]
};

const output = [];
for (let arr of Object.values(data)) {
  for (let i = 0; i < arr.length; i++) {
    if (output[i] === undefined) {
      output[i] = [];
    }
    output[i].push(arr[i]);
  }
}

console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }

这是一种方法,您可以从每个子数组转移到下一个项目,以便为结果收集下一个子数组:

let obj = {'first': [{name: 'jimmy',text: 'I love you'},{name: 'jimmy',text: 'I miss you!'},{name: 'jimmy',text: 'I hate you!'}],'second': [{name: 'jeremy',text: 'Wow'}],'third': [{name: 'john',text: 'You ugly'},{name: 'john',text: 'You handsome'},{name: 'john',text: 'you beautiful'}],'fourth': [{name: 'tom',text: 'this is cool!'},{name: 'tom',text: 'this is hard'}]};

let arr = Object.values(obj),
    result = [];
while ((arr = arr.filter(sub => sub.length)).length) {
    result.push(arr.map(sub => sub.shift()));
}
console.log(result);