Реструктурировать массив объектов JavaScript другим предопределенным элементом Array в качестве ключа - PullRequest
0 голосов
/ 03 декабря 2018

Я поместил этот же код и в jsbin: https://jsbin.com/literefeqo/edit?js,console

Объяснение

Я получил массив объектов (1) и хотел бы преобразовать(возможно, используя карту) этот объект.Критерием преобразования является заданный массив (2), который соответствует свойству german в arrObj.Это означает, что если в arrObj есть свойство german, его следует «скопировать» и использовать в качестве ключа для получения resultObj (3).Если свойство german отсутствует, то ключ должен быть «Неизвестен» или что-то в этом роде.

Примечание: в resultObj может быть больше записей, например, Montag.Таким образом, resultObj.Montag[i] должен быть массивом объектов.

(1) Массив объектов

const arrObj = [
{
    "day": {
    "string": "Monday",
    "Number": 1
    },
    "description": {
    "type": "string",
    "value": "The first day of the week"
    },
    "german": {
    "type": "string",
    "value": "Montag"
    }
},
{
    "day": {
    "string": "Tuesday",
    "Number": 2
    },
    "description": {
    "type": "string",
    "value": "The second day of the week"
    }
},
{
    "day": {
    "string": "Wednesday",
    "Number": 3
    },
    "description": {
    "type": "string",
    "value": "The third day of the week"
    },
    "german": {
    "type": "string",
    "value": "Mittwoch"
    }
}
];

(2) Массив, который должен статьключ для нового объекта

const germanDays = ["Montag","Dienstag","Mittwoch","Donnerstag"];

(3) Результат должен выглядеть следующим образом:

const resultObj =   {
"Montag": [
  {
    "day": {
      "string": "Monday",
      "Number": 1
    },
    "description": {
      "type": "string",
      "value": "The first day of the week"
    },
    "german": {
      "type": "string",
      "value": "Montag"
    }
  }
],
"Dienstag": [
  {}
],
"Mittwoch": [
  {
    "day": {
      "string": "Wednesday",
      "Number": 3
    },
    "description": {
      "type": "string",
      "value": "The third day of the week"
    },
    "german": {
      "type": "string",
      "value": "Mittwoch"
    }
  }
],
"Donnerstag": [
  {}
],
"Unknown": [
  {
    "day": {
      "string": "Tuesday",
      "Number": 2
    },
    "description": {
      "type": "string",
      "value": "The second day of the week"
    }
  }
]

};

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

(возможно, с использованием карты)

map, предназначено для отображения массива в массив, более подходящей является функция Reduction.

Вот пример.

const germanDays = ["Montag","Dienstag","Mittwoch","Donnerstag"]

const arrObj = [
{
    "day": {
    "string": "Monday",
    "Number": 1
    },
    "description": {
    "type": "string",
    "value": "The first day of the week"
    },
    "german": {
    "type": "string",
    "value": "Montag"
    }
},
{
    "day": {
    "string": "Tuesday",
    "Number": 2
    },
    "description": {
    "type": "string",
    "value": "The second day of the week"
    }
},
{
    "day": {
    "string": "Wednesday",
    "Number": 3
    },
    "description": {
    "type": "string",
    "value": "The third day of the week"
    },
    "german": {
    "type": "string",
    "value": "Mittwoch"
    }
},
{
    "day": {
    "string": "Monday",
    "Number": 1
    },
    "description": {
    "type": "string",
    "value": "Just another text is here"
    },
    "german": {
    "type": "string",
    "value": "Montag"
    }
}
];

const ret = germanDays.reduce((a, v) => {
  const f = arrObj.filter(f => f.german && f.german.value === v);
  a[v] = f;
  return a;
}, {
  "Unknown": arrObj.filter(f => !f.german)
});


console.log(ret);
0 голосов
/ 03 декабря 2018

Примерно так (нажмите кнопку «Выполнить фрагмент кода»):

const arrObj = [
{
    "day": {
    "string": "Monday",
    "Number": 1
    },
    "description": {
    "type": "string",
    "value": "The first day of the week"
    },
    "german": {
    "type": "string",
    "value": "Montag"
    }
},
{
    "day": {
    "string": "Tuesday",
    "Number": 2
    },
    "description": {
    "type": "string",
    "value": "The second day of the week"
    }
},
{
    "day": {
    "string": "Wednesday",
    "Number": 3
    },
    "description": {
    "type": "string",
    "value": "The third day of the week"
    },
    "german": {
    "type": "string",
    "value": "Mittwoch"
    }
}
];


const germanDays = ["Montag", "Dienstag", "Mittwoch", "Donnerstag"];

const resultObj = {}

for (const item of arrObj) {
    if (item.german && item.german.value && germanDays.includes(item.german.value)) {
        addVal(item.german.value, item)
    } else {
        addVal('unknown', item)
    }
}

// helper func
function addVal(key, val) {
    if(!resultObj[key]) {
        resultObj[key] = []
    }
    resultObj[key].push(val)
}

console.log(resultObj)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...