Фильтрация вложенного объекта по ключам, которые соответствуют значениям в массиве - PullRequest
0 голосов
/ 05 ноября 2018

У меня трудности с фильтрацией ключей вложенного объекта на основе другого массива при сохранении исходной структуры объекта.

Введите:

data = [
          {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}},
          {1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}}
       ]

arr = [g1, g2, g3]

Ожидаемый результат:

data = [
          {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0}}}},
          {1: { key: "B", values: { 0: {g2: 0, g3: 0}}}}
       ]

Что я сделал до сих пор:

data.forEach(function(e,i) {
    r = Object.keys(e[i].values[0]).filter(d => arr.includes(d))
    console.log(r)
})

Это правильно печатает [g1, g2, g3] и [g2, g3], но я хочу сохранить исходную структуру объекта, а не просто иметь список общих ключей.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Возможно, что-то подобное поможет, если ваш data объект верен форме (объяснение включено в качестве комментариев кода).

function pruneObject(object, desiredKeys) {
  Object.keys(object)
    .filter(key => !desiredKeys.includes(key))  //Ignore desired keys
    .forEach(key => delete object[key])         //Remove the leftovers
}

var data = [{ 0: { key: "A", values: { 0: { g1: 0, g2: 0, g3: 0, g4: 0 } } } }, { 1: { key: "B", values: { 0: { g2: 0, g3: 0, g5: 0 } } } } ];
var arr = ['g1', 'g2', 'g3'];

data.forEach((item,index) => pruneObject(item[index].values[0], arr)); //Prune each "values" object

console.log(data);

Примечание: Это изменяет исходный объект, хотя при необходимости я мог бы написать альтернативное решение, чтобы сохранить его и вернуть вместо него новый объект.

0 голосов
/ 05 ноября 2018

Этот код делает то, что вы хотите. Сократите массив r до объекта и назначьте его исходному объекту.

var data = [
          {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}},
          {1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}}
       ]

var arr = ["g1", "g2", "g3"]


var output = data.map(function(e,i) {
    var r = Object.keys(e[i].values[0]).filter(d => arr.includes(d));
    var values = r.reduce((obj,key)=>{obj[key] = 0 ; return obj;},{});
    var obj = {};
    obj[i] = Object.assign(e[i],{values:{0:values}})
    console.log(obj);
    return obj;
})

console.log(output);

На самом деле это не намного лучше, чем восстановление выходного объекта с нуля

var data = [
          {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}},
          {1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}}
       ]

var arr = ["g1", "g2", "g3"]

var output = data.map(function(e,i) {
    var obj = {};
    obj[i] = {key : e[i].key, values : {0:{}}};
    arr.forEach((ele)=>{
      if(e[i].values[0][ele] != undefined)
      {
         obj[i].values[0][ele] = e[i].values[0][ele];
      }
    });
    
    console.log(obj);
    return obj;
})

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