根据其对新数组的索引,使用键对对象进行分组
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()
来获取值。
然后,想法是从一个空数组 all
(reduce()
的第二个参数)开始,然后遍历 input
.
然后对于每个元素 cur
我们遍历这个元素的所有 items
并且对于每个 items
我们检查我们是否有这个元素的索引 (idx
) 已经在 all
数组中。
如果我们不这样做,这个索引比之前添加的任何索引都大,我们需要扩展我们的 all
数组以保存该值。由于我们期望给定点有多个值,因此我们需要使用数组作为该点的值。如果给定索引已经有至少一个值,那么在给定索引处已经有一个数组,我们只需要 push()
将新项目添加到 all
数组中。
Mushroomator's 可能是最简洁的方法。
如果您是 JavaScript、函数式编程或整体编程的新手,我认为以下是一种不错的 intro-level 方法,可能更容易理解。
基本逻辑是相同的,只是步骤更加explicit/more明显。
- 创建一个
output
数组来保存结果。
- 使用
Object.values()
.[=44= 从 data
中获取 first
、second
、third
和 fourth
数组]
- 对于第 2 步中的每个数组,使用
for
循环迭代它们的项目。
- 如果
output
还没有当前索引的嵌套数组,请创建一个。
Array#push()
将当前数组中当前索引处的项放入 output
. 中当前索引处的数组中
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);
有谁知道如何根据 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()
来获取值。
然后,想法是从一个空数组 all
(reduce()
的第二个参数)开始,然后遍历 input
.
然后对于每个元素 cur
我们遍历这个元素的所有 items
并且对于每个 items
我们检查我们是否有这个元素的索引 (idx
) 已经在 all
数组中。
如果我们不这样做,这个索引比之前添加的任何索引都大,我们需要扩展我们的 all
数组以保存该值。由于我们期望给定点有多个值,因此我们需要使用数组作为该点的值。如果给定索引已经有至少一个值,那么在给定索引处已经有一个数组,我们只需要 push()
将新项目添加到 all
数组中。
Mushroomator's
如果您是 JavaScript、函数式编程或整体编程的新手,我认为以下是一种不错的 intro-level 方法,可能更容易理解。
基本逻辑是相同的,只是步骤更加explicit/more明显。
- 创建一个
output
数组来保存结果。 - 使用
Object.values()
.[=44= 从data
中获取first
、second
、third
和fourth
数组] - 对于第 2 步中的每个数组,使用
for
循环迭代它们的项目。 - 如果
output
还没有当前索引的嵌套数组,请创建一个。 Array#push()
将当前数组中当前索引处的项放入output
. 中当前索引处的数组中
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);