Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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代码更高效,但可读性更好_Javascript - Fatal编程技术网

这段JavaScript代码更高效,但可读性更好

这段JavaScript代码更高效,但可读性更好,javascript,Javascript,假设我有3个数组,其中一个基于另一个数组,但我需要将它们组合成一个。。我在这里使用forEach循环将项目推送到数组中,但我觉得这样做效率很低 const arr1=[1,2,3]; 常数arr2=[“a”,“b”]; 常量arr3=[“foo”、“bar”、“baz”]; 常量obj={ “1_a”:[1,2], “1_b”:[1,2,3], “2_a”:[1], “2_b”:[1,2], “3_a”:[], “3_b”:[1,2,3] }; //使用forEach循环将所有项推送到临时数组,

假设我有3个数组,其中一个基于另一个数组,但我需要将它们组合成一个。。我在这里使用forEach循环将项目推送到数组中,但我觉得这样做效率很低

const arr1=[1,2,3];
常数arr2=[“a”,“b”];
常量arr3=[“foo”、“bar”、“baz”];
常量obj={
“1_a”:[1,2],
“1_b”:[1,2,3],
“2_a”:[1],
“2_b”:[1,2],
“3_a”:[],
“3_b”:[1,2,3]
};
//使用forEach循环将所有项推送到临时数组,
//我觉得这种逻辑可以变得更具可读性和效率
设tempArr=[];
arr1.forEach(i=>
arr2.forEach(j=>
tempArr.push(`i}{j}`)
)
);
arr3.forEach(i=>tempArr.push(i));
//在临时数组上循环以获得最终结果(记录在下面)
const arr=tempArr.map(键=>{
if(obj[key]!==undefined&&obj[key].length>1)返回`update_${key}`;
否则返回键;
});
//结果
console.log(arr);//[“update_1_a”、“update_1_b”、“2_a”、“update_2_b”、“3_a”、“update_3_b”]
我觉得所有的
forEach
推送都有问题,我觉得应该有嵌套映射函数之类的东西。。?请帮帮我

我希望发生以下情况:

  • arr2的值基于arr1的循环(参见示例),这些值与下划线pseudo:
    arr1Item\u arr2Item
    组合在一起,该项被推送到数组中
  • arr3的值,只是循环和推送
  • 合并后的数组会循环,如果该项的值在对象中,并且该键的数组长度大于1,则返回
    update\uuuuuu
    ,否则只返回

    • 不确定是否更好,但它是一个
      减少
      映射

      const arr1=[1,2,3];
      常数arr2=[“a”,“b”];
      常量arr3=[“foo”、“bar”、“baz”];
      常量对象={
      “1_a”:[1,2],
      “1_b”:[1,2,3],
      “2_a”:[1],
      “2_b”:[1,2],
      “3_a”:[],
      “3_b”:[1,2,3],
      };
      const result=arr1.reduce(
      (a,c)=>
      (a.concat(
      arr2.map((y)=>{
      常量键=`c}{y}`;
      返回obj[key]!==未定义和&obj[key]。长度>1
      ?`更新${key}`
      :键;
      })
      )),
      arr3
      );
      控制台日志(结果)您可以尝试:

      const arr1=[1,2,3];
      常数arr2=['a','b'];
      常量对象={
      “1_a”:[1,2],
      “1_b”:[1,2,3],
      “2_a”:[1],
      “2_b”:[1,2],
      “3_a”:[],
      “3_b”:[1,2,3]
      };
      const result=arr1.reduce((acc,a1)=>
      […acc,…arr2.map(a2=>{
      const keyCombined=`${a1}{a2}`;
      返回对象[keyCombined]。长度>1
      ?`更新${keyCombined}`
      :“${keyCombined}”;
      })], []);
      
      控制台日志(结果)另一种使用
      flatMap
      的方法:

      const arr1=[1,2,3];
      常数arr2=[“a”,“b”];
      常量arr3=[“foo”、“bar”、“baz”];
      常量对象={
      “1_a”:[1,2],
      “1_b”:[1,2,3],
      “2_a”:[1],
      “2_b”:[1,2],
      “3_a”:[],
      “3_b”:[1,2,3]
      };
      常数结果=[
      ……啊,
      …啊
      .flatMap(a=>arr2
      .map(b=>{
      常量键=`${a}{b}`;
      返回对象[key]。长度>1
      ?`更新${key}`
      :键;
      }))
      ]
      
      console.log(result)
      请添加想要的结果。@NinaScholz I did构造最终数组的逻辑是什么?请解释。@GhassenLouhaichi我尽量解释清楚,请看:)arr3的目的是什么?它没有被使用,你也说“长于5”,但根据你粘贴的代码,它更像1。没什么大不了,但不需要
      (a=a.concat(
      )(a.concat(
      )就足够了。但是如果有第三个数组呢?(见帖子):-)reduce可以使用第三个数组作为起点,但是示例对象没有
      foo
      bar
      baz
      keys@Anthony你做的编辑很好,太棒了,谢谢!