数组的复杂问题

问题描述

我有一个需要解决的复杂问题。
我有一个看起来像这样的数组:

var array = [
             ["1hszZhsez7","mb12",0],["87hJKLi893",1,"tt43",["jchd79dcic",2],["as0w9ejasm",1],["coosihchw9","zz00",["vs0x0j9ndm","uu33",["00s0kd20r7",["xassdwddao",["caosw8ncxc",2,0]
            ];   

此数组始终具有不同的值。所以我们进去吧。
数组基本上具有以下值:

var array = [
             [id,type,code,priority]
            ];      

ID: ID是唯一的。没什么特别的
类型:共有三种不同的类型。 0、1和2。
代码代码不是唯一的。多个数组项可以相同。
优先级:优先级是数字。如果数字低,则优先级高。如果数量较大,则优先级较低。


任务:
首先,我们需要将不同的类型分类为不同的数组。这样看起来像这样:

var type_zero = [
                 ["coosihchw9",0]
                ];   

var type_one = [
                 ["87hJKLi893",1]
                ];  
 
var type_two = [
                 ["caosw8ncxc",0]
                ];  

使用此功能很容易:

 array.forEach(function(item) {
      if (item[1] === 0) {
        type_zero.push([item[0],item[1],item[2],item[3],item[4],item[5]]);
      }
      else if (item[1] === 1) {
        type_one.push([item[0],item[5]]);
      }
      else if (item[1] === 2) {
        type_two.push([item[0],item[5]]);
      }
    });     

但是随后头痛开始了。我们需要为每个代码组创建一个单独的数组。但是我们永远不知道有多少不同的代码。所以我们不能制作静态数组。
无论我们使用哪种代码。最后,它应该像这样,基于示例数组

var type_zero_zz00 = [
                      ["coosihchw9",0]
                     ];

var type_one_tt43 = [
                      ["87hJKLi893",];

 var type_one_uu33 = [
                      ["vs0x0j9ndm",1]
                     ];
      
 var type_two_uu33 = [
                      ["caosw8ncxc",0]
                     ];  

为什么需要这些数组?在下一步中,我必须为每个数组列表执行一个forEach循环。我希望有人知道解决方案,因为这个问题杀死了许多天,并且关于不可能的想法越来越大。
提前谢谢,
马吕斯

解决方法

我看到您所需要的只是创建函数来获取所需的信息,而不是创建许多不同的变量。

下面是您需要做什么的想法,而不是您所需要的100%准确的版本

var array = [
             ["1hszZhsez7","mb12",0],["87hJKLi893",1,"tt43",["jchd79dcic",2],["as0w9ejasm",1],["coosihchw9","zz00",["vs0x0j9ndm","uu33",["00s0kd20r7",["xassdwddao",["caosw8ncxc",2,0]
            ];   
            
   function getByCode(code){
       return array.filter( item => item[1] === code);
   }
   
   function getByGroup(group){
       return array.filter( item => item[2] === group);
   }

,

您可以使用单个数组,而只需将代码用作数组索引即可。

var output = [];

var array = [
  ["1hszZhsez7",0]
];

array.forEach(function(item) {
  if (output[item[1]] == undefined) {
    output[item[1]] = []
  }
  output[item[1]].push(item);
});

console.log(0,output[0])
console.log(1,output[1])
console.log(2,output[2])

,

使用二维字典怎么办?这样,您将最终得到一个像这样的数据结构,您可以在其中为类型和代码组添加新值(即字典本身):

A
,

创建一个处理动态代码的地图:

var type = {};
type["0"]["zz00"] = [
                  ["coosihchw9",0]
                 ];
type["1"]["tt43"] = [
                  ["87hJKLi893",];

type["1"]["uu33"] = [
                  ["vs0x0j9ndm",1]
                 ];
  
type["2"]["uu33"] = [
                  ["caosw8ncxc",0]
                 ];  

现在,如果类型本身正在动态化,也可以为它们创建一个映射器。两级地图。

,

代替为类型和代码的每个组合创建新变量,而是为每个组合创建具有属性的对象。现在,它实际上是一个简单的按两个键分组的问题。您可以使用url(r'^((?P<pk>\d+))/$',views.DetailView.as_view(),name='detail'),,并生成一个对象或一个Map:

Array.reduce()
const array = [["1hszZhsez7",0]];

const types = ['zero','one','two'];

const result = array.reduce((r,row) => {
  const [,type,code] = row;

  const key = `type_${types[type]}_${code}`;
  
  if(!r[key]) r[key] = [];
  
  r[key].push(row);

  return r;
},{});

console.log(result);

,

您可以像这样构建一个对象来解决问题,而不是尝试创建许多变量。

<LinearLayout
        android:id="@+id/forgotPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        >


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:autoLink="all"
            android:linksClickable="false"
            android:selectAllOnFocus="false"

            android:text="Forgot password? "
            android:textAlignment="center"
            android:textColor="@android:color/white"
            />

        <TextView

            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:autoLink="all"
            android:linksClickable="false"
            android:selectAllOnFocus="false"

            android:text="Reset here"
            android:textAlignment="center"
            android:textColor="@android:color/white"
            android:textStyle="bold" />
    </LinearLayout>

然后您可以像这样通过这些对象进行映射:

const results = {
  0: {},1: {},2: {},};

for (let item of array) {
  let [id,code,priority] = item;

  if (results[type][code] === undefined) {
    results[type][code] = [item];
  } else {
    results[type][code] = results[type][code].concat([item]);
  }
}
,

您可以使用var parser = new DOMParser(); doc = parser.parseFromString(resp,'text/xml'); var vData = doc.getElementsByTagName("Key")[0].childNodes; 方法和对象作为累加器来执行此操作,可使用reduce作为键将值分组。

type-code