在不复制的情况下拆分数组对象
Split an array-object without replication
我正在学习如何处理 js 数组,我想知道是否可以通过拆分现有对象的属性来创建新的数组对象。
我尝试使用 .map 和 .flatMap 来做到这一点,但输出为我提供了复制其他值的对象组合,而我正在寻找独特的对象
我认为代码可以更清晰:
const array=[
{ names:['something1', 'something2'],
state:false,
features:['feature1','feature2']
},
{ names:['something3', 'something4'],
state:true,
features:['feature3','feature4']
},
]
array.flatMap(({names,state,features}) => {
names.flatMap(name => {
features.flatMap(feature => {
console.log(({name,state,feature}));
})
})
})
因此,使用此代码的输出是:
{ name: 'something1', state: false, feature: 'feature1' }
{ name: 'something1', state: false, feature: 'feature2' }
{ name: 'something2', state: false, feature: 'feature1' }
{ name: 'something2', state: false, feature: 'feature2' }
{ name: 'something3', state: true, feature: 'feature3' }
{ name: 'something3', state: true, feature: 'feature4' }
{ name: 'something4', state: true, feature: 'feature3' }
{ name: 'something4', state: true, feature: 'feature4' }
但我希望输出为:
{ name: 'something1', state: false, feature: 'feature1' },
{ name: 'something2', state: false, feature: 'feature2' },
{ name: 'something3', state: true, feature: 'feature3' },
{ name: 'something4', state: true, feature: 'feature4' }
我是编码新手,如果我的话在描述这个问题时不正确,请原谅。
感谢您的耐心等待
给你,对最后一个稍作修改。只是地图名称。
const arr = [{
names: ["test1", "test2"],
values: ["t1", "t2"]
},
{
names: ["test3", "test4"],
values: ["t3", "t4"]
}];
const flat = arr.reduce((a, {names, values}) => {
names.map((name, i) => {
a.push({ name, value: values[i]});
});
return a;
}, []).flat();
console.log(`Flat: ${JSON.stringify(flat)}`);
您可以使用 .flatMap()
和内部 .map()
函数(而不是像您正在做的 .flatMap()
)将 names
数组中的每个元素映射到它的拥有各自的对象及其关联 feature
.
参见下面的示例:
const array = [{
names: ['something1', 'something2'],
state: false,
features: ['feature1', 'feature2']
},
{
names: ['something3', 'something4'],
state: true,
features: ['feature3', 'feature4']
},
];
const res = array.flatMap(
({names, state, features}) => names.map((name, i) => ({name, state, feature: features[i]}))
);
console.log(res);
如果你想学习编程,魔法可能不是最好的选择。 map()
, reduce()
之类的本身就是算法。基础知识是用简单的循环(for
、while
)和有时递归(就像这个问题起源的一般解决方案)来完成这些任务。
你现在拥有的是一个数组,你可以在 outer
循环中对其进行迭代,并且内部有具有并行数组的对象,你也可以在 [=16] 中对其进行迭代=]循环:
const array=[
{ names:['something1', 'something2'],
state:false,
features:['feature1','feature2']
},
{ names:['something3', 'something4'],
state:true,
features:['feature3','feature4']
},
];
for(let outer=0;outer<array.length;outer++){
let obj=array[outer];
for(let inner=0;inner<obj.names.length;inner++)
console.log({
name:obj.names[inner],
state:obj.state,
feature:obj.features[inner]
});
}
那么是的,外循环根本不需要索引,所以它可以直接遍历元素(for(let obj of array)
或array.forEach()
),但是对于inner
循环你需要索引,所以把它扔掉并不是那么简单(请参阅建议的 map()
变体的奇怪不平衡:它们有 name
,和 features[i]
- 当然 name
实际上已经 names[i]
提取出来了,但它隐藏了两个数组并行遍历的事实)。
我正在学习如何处理 js 数组,我想知道是否可以通过拆分现有对象的属性来创建新的数组对象。
我尝试使用 .map 和 .flatMap 来做到这一点,但输出为我提供了复制其他值的对象组合,而我正在寻找独特的对象
我认为代码可以更清晰:
const array=[
{ names:['something1', 'something2'],
state:false,
features:['feature1','feature2']
},
{ names:['something3', 'something4'],
state:true,
features:['feature3','feature4']
},
]
array.flatMap(({names,state,features}) => {
names.flatMap(name => {
features.flatMap(feature => {
console.log(({name,state,feature}));
})
})
})
因此,使用此代码的输出是:
{ name: 'something1', state: false, feature: 'feature1' }
{ name: 'something1', state: false, feature: 'feature2' }
{ name: 'something2', state: false, feature: 'feature1' }
{ name: 'something2', state: false, feature: 'feature2' }
{ name: 'something3', state: true, feature: 'feature3' }
{ name: 'something3', state: true, feature: 'feature4' }
{ name: 'something4', state: true, feature: 'feature3' }
{ name: 'something4', state: true, feature: 'feature4' }
但我希望输出为:
{ name: 'something1', state: false, feature: 'feature1' },
{ name: 'something2', state: false, feature: 'feature2' },
{ name: 'something3', state: true, feature: 'feature3' },
{ name: 'something4', state: true, feature: 'feature4' }
我是编码新手,如果我的话在描述这个问题时不正确,请原谅。 感谢您的耐心等待
给你,对最后一个稍作修改。只是地图名称。
const arr = [{
names: ["test1", "test2"],
values: ["t1", "t2"]
},
{
names: ["test3", "test4"],
values: ["t3", "t4"]
}];
const flat = arr.reduce((a, {names, values}) => {
names.map((name, i) => {
a.push({ name, value: values[i]});
});
return a;
}, []).flat();
console.log(`Flat: ${JSON.stringify(flat)}`);
您可以使用 .flatMap()
和内部 .map()
函数(而不是像您正在做的 .flatMap()
)将 names
数组中的每个元素映射到它的拥有各自的对象及其关联 feature
.
参见下面的示例:
const array = [{
names: ['something1', 'something2'],
state: false,
features: ['feature1', 'feature2']
},
{
names: ['something3', 'something4'],
state: true,
features: ['feature3', 'feature4']
},
];
const res = array.flatMap(
({names, state, features}) => names.map((name, i) => ({name, state, feature: features[i]}))
);
console.log(res);
如果你想学习编程,魔法可能不是最好的选择。 map()
, reduce()
之类的本身就是算法。基础知识是用简单的循环(for
、while
)和有时递归(就像这个问题起源的一般解决方案)来完成这些任务。
你现在拥有的是一个数组,你可以在 outer
循环中对其进行迭代,并且内部有具有并行数组的对象,你也可以在 [=16] 中对其进行迭代=]循环:
const array=[
{ names:['something1', 'something2'],
state:false,
features:['feature1','feature2']
},
{ names:['something3', 'something4'],
state:true,
features:['feature3','feature4']
},
];
for(let outer=0;outer<array.length;outer++){
let obj=array[outer];
for(let inner=0;inner<obj.names.length;inner++)
console.log({
name:obj.names[inner],
state:obj.state,
feature:obj.features[inner]
});
}
那么是的,外循环根本不需要索引,所以它可以直接遍历元素(for(let obj of array)
或array.forEach()
),但是对于inner
循环你需要索引,所以把它扔掉并不是那么简单(请参阅建议的 map()
变体的奇怪不平衡:它们有 name
,和 features[i]
- 当然 name
实际上已经 names[i]
提取出来了,但它隐藏了两个数组并行遍历的事实)。