Javascript 使用LoDash或类似工具规范化/展平JS数组?
我需要能够规范化javascript对象或将其展平,我希望能够使用lodash做一些事情,但我不知所措。我试着写我自己的转换器,但它似乎太复杂了,我想lodash可以做这样的事情 我正在放置我拥有的原始数组,它有3个带有子数组的项。(见下文) 这就是我所期望的(创建我的新对象),因此所有内容都被展平并添加到“名称”(请参见下面的testProduct1和testProduct2),如果没有可用的颜色和位置,则名称只是原始名称(请参见下面的testProduct3) 下面是原始数组的示例Javascript 使用LoDash或类似工具规范化/展平JS数组?,javascript,lodash,Javascript,Lodash,我需要能够规范化javascript对象或将其展平,我希望能够使用lodash做一些事情,但我不知所措。我试着写我自己的转换器,但它似乎太复杂了,我想lodash可以做这样的事情 我正在放置我拥有的原始数组,它有3个带有子数组的项。(见下文) 这就是我所期望的(创建我的新对象),因此所有内容都被展平并添加到“名称”(请参见下面的testProduct1和testProduct2),如果没有可用的颜色和位置,则名称只是原始名称(请参见下面的testProduct3) 下面是原始数组的示例 {
{
name: ‘testProduct1’,
colors: [
‘RED’,
‘YELLOW’
],
locations: [
‘New York’,
‘London’
]
},
{
name: ‘testProduct2’,
colors: [
‘WHITE’
],
locations: [
‘New York’,
‘London’
]
},
{
name: ‘testProduct3’,
}
我想你想要一张地图
list.map((element) => {
return {
name: [element.name].concat(element.colors, element.locations).join(' ')
};
});
我想你想要一张地图
list.map((element) => {
return {
name: [element.name].concat(element.colors, element.locations).join(' ')
};
});
编写一组基本循环可能更容易:
var result = [];
for (let i = 0; i < arr.length; i++) {
let colors = arr[i].colors || [];
for (let j = 0; j < colors.length; j++) {
let locations = arr[i].locations || [];
for (let k = 0; k < locations.length; k++) {
result.push({name: arr[i].name + ' ' + colors[j] + ' ' + locations[k]]});
]
}
}
编写一组基本循环可能更容易:
var result = [];
for (let i = 0; i < arr.length; i++) {
let colors = arr[i].colors || [];
for (let j = 0; j < colors.length; j++) {
let locations = arr[i].locations || [];
for (let k = 0; k < locations.length; k++) {
result.push({name: arr[i].name + ' ' + colors[j] + ' ' + locations[k]]});
]
}
}
这是一个纯Javascript的解决方案
var data=[{name:'testProduct1',颜色:['RED','YELLOW'],位置:['New York','London']},{name:'testProduct2',颜色:['WHITE'],位置:['New York','London']},{name:'testProduct3',},
平面=函数(数组){
变量顺序=[“颜色”,“位置”],
r=[];
array.forEach(函数(a){
函数getParts(parts){
如果(parts.length>=订单长度){
零件。未移位(a.名称);
r、 push({name:parts.filter(Boolean.join('')});
返回;
}
(a[订单[零件长度])| |[''])forEach(函数(b){
getParts(parts.concat(b));
});
}
getParts([]);
});
返回r;
}(数据);
document.write(''+JSON.stringify(flat,0,4)+'')代码>这是一个纯Javascript解决方案
var data=[{name:'testProduct1',颜色:['RED','YELLOW'],位置:['New York','London']},{name:'testProduct2',颜色:['WHITE'],位置:['New York','London']},{name:'testProduct3',},
平面=函数(数组){
变量顺序=[“颜色”,“位置”],
r=[];
array.forEach(函数(a){
函数getParts(parts){
如果(parts.length>=订单长度){
零件。未移位(a.名称);
r、 push({name:parts.filter(Boolean.join('')});
返回;
}
(a[订单[零件长度])| |[''])forEach(函数(b){
getParts(parts.concat(b));
});
}
getParts([]);
});
返回r;
}(数据);
document.write(''+JSON.stringify(flat,0,4)+'')代码>
或
更简洁
或
更简洁
只是出于好奇,这不是去规范化吗?卷曲引号不会很好用。只是出于好奇,这不是去规范化吗?卷曲引号不会很好用。我不会用胖箭头函数来回答你的问题。大多数浏览器都不支持这些功能。雪人认为使用胖箭头功能是可以的。Chrome、Firefox和Edge以及任何transpiler都支持它们。如果用户在一个他们不在的环境中工作,他可以做一个简单的重写。更基本的问题是这个答案不起作用。@acbabis顺便说一句,正确的术语是“箭头函数”。@torazaburo实际上,两者都是可以接受的。从:“箭头函数表达式(也称为胖箭头函数)有…”@acbabis不是真的。规范使用术语“箭头函数”。“也称为MDN页面中的“应理解为”也通俗地称为fat arrow函数,基于以前的用法,现在不推荐使用…。我不会使用fat arrow函数来回答您的问题。大多数浏览器都不支持这些功能。雪人认为使用胖箭头功能是可以的。Chrome、Firefox和Edge以及任何transpiler都支持它们。如果用户在一个他们不在的环境中工作,他可以做一个简单的重写。更基本的问题是这个答案不起作用。@acbabis顺便说一句,正确的术语是“箭头函数”。@torazaburo实际上,两者都是可以接受的。从:“箭头函数表达式(也称为胖箭头函数)有…”@acbabis不是真的。规范使用术语“箭头函数”。“也称为在MDN页面中,应理解为“也通俗地称为fat arrow函数,基于以前的用法,现在已弃用…”。这不起作用,因为列表中的第三项没有colors
属性或locations
属性。这不起作用,因为列表中的第三项没有colors
属性或locations
属性。
var resultArr = inArr.reduce((initArr, cur) =>
{
if (cur.colors && cur.locations)
{
cur.colors.forEach(col =>
cur.locations.forEach(loc =>
initArr.push({ name: cur.name + ' ' + col + ' ' + loc })));
}
else
{
initArr.push({ name: cur.name });
}
return initArr;
}, [] /* Passed as initArr */);
var resultArr = inArr.reduce((initArr, cur) =>
{
for (let col of cur.colors || [''])
for (let loc of cur.locations || [''])
initArr.push({ name: (cur.name + ' ' + col + ' ' + loc).trim() });
return initArr;
}, [] /* Passed as initArr */);