Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用LoDash或类似工具规范化/展平JS数组?_Javascript_Lodash - Fatal编程技术网

Javascript 使用LoDash或类似工具规范化/展平JS数组?

Javascript 使用LoDash或类似工具规范化/展平JS数组?,javascript,lodash,Javascript,Lodash,我需要能够规范化javascript对象或将其展平,我希望能够使用lodash做一些事情,但我不知所措。我试着写我自己的转换器,但它似乎太复杂了,我想lodash可以做这样的事情 我正在放置我拥有的原始数组,它有3个带有子数组的项。(见下文) 这就是我所期望的(创建我的新对象),因此所有内容都被展平并添加到“名称”(请参见下面的testProduct1和testProduct2),如果没有可用的颜色和位置,则名称只是原始名称(请参见下面的testProduct3) 下面是原始数组的示例 {

我需要能够规范化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 */);