Reduce по объекту, вытащить нужные свойства

198
11 ноября 2019, 21:30

Есть объект.

    var data = {
  "podauschaya_linya_1_kontura_name": {
    "Короткая посадочное": {
      "Значение резьбы": "G 1\"",
      "Диаметр отверстия": 30,
      "Подходящая номенклатура из 1С": {
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30",
      },
      "Цена": "36"
    }
  },
  "podauschaya_linya_2_kontura_name": {
    "Короткая посадочное": {
      "Значение резьбы": "G 1\"",
      "Диаметр отверстия": 30,
      "Подходящая номенклатура из 1С": {
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30",
      },
      "Цена": "36"
    }
  },
  "obratnaya_linya_2_kontura_name": {
    "Короткая посадочное": {
      "Значение резьбы": "G 1\"",
      "Диаметр отверстия": 30,
      "Подходящая номенклатура из 1С": {
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30",
      },
      "Цена": "36"
    }
  },
  "obratnaya_linya_1_kontura_name": {
    "Короткая посадочное": {
      "Значение резьбы": "G 1\"",
      "Диаметр отверстия": 30,
      "Подходящая номенклатура из 1С": {
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30",
      },
      "Цена": "36"
    }
  },
  "podauschaya_linya_rezervnogo_kotla_name": {
    "Короткая посадочное": {
      "Значение резьбы": "G ¾\"",
      "Диаметр отверстия": 25,
      "Подходящая номенклатура из 1С": {
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 25",
      },
      "Цена": "30"
    }
  },
  "obratnaya_linya_rezervnogo_kotla_name": {
    "Короткая посадочное": {
      "Значение резьбы": "G ¾\"",
      "Диаметр отверстия": 25,
      "Подходящая номенклатура из 1С": {
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 25",
      },
      "Цена": "30"
    }
  },
  "kotlovoi_kontur_select_name": {
    "Короткая посадочное слева_сверху": {
      "Значение резьбы": "G 1\"",
      "Диаметр отверстия": 30,
      "Подходящая номенклатура из 1С": {
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30",
      },
      "Цена": "36"
    },
    "Короткая посадочное слева_снизу": {
      "Значение резьбы": "G 1\"",
      "Диаметр отверстия": 30,
      "Подходящая номенклатура из 1С": {
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30",
      },
      "Цена": "36"
    }
  }
}

Понимаю что должен помочь Reduce, но запутался во вложенности.

var getCollectInformation = data => Object.keys(data).reduce( (result, key) =>{ ... }
/* Object.keys(data) даёт доступ к такой вложенности */
[
  "podauschaya_linya_1_kontura_name",
  "podauschaya_linya_2_kontura_name",
  "podauschaya_linya_rezervnogo_kotla_name",
  "obratnaya_linya_rezervnogo_kotla_name"
]
Answer 1

/* Object.keys(data) даёт доступ к такой вложенности */

А дальше идут однотипные объекты, к полям которых можно обращаться по именам.

Также можно воспользоваться методом Object.values, который сразу возвращает значения объекта, а не только ключи.

Например:

var data = { 
  "podauschaya_linya_1_kontura_name": { 
    "Короткая посадочное": { 
      "Значение резьбы": "G 1\"", 
      "Диаметр отверстия": 30, 
      "Подходящая номенклатура из 1С": { 
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30", 
      }, 
      "Цена": "36" 
    } 
  }, 
  "podauschaya_linya_2_kontura_name": { 
    "Короткая посадочное": { 
      "Значение резьбы": "G 1\"", 
      "Диаметр отверстия": 30, 
      "Подходящая номенклатура из 1С": { 
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30", 
      }, 
      "Цена": "36" 
    } 
  }, 
  "podauschaya_linya_rezervnogo_kotla_name": { 
    "Короткая посадочное": { 
      "Значение резьбы": "G ¾\"", 
      "Диаметр отверстия": 25, 
      "Подходящая номенклатура из 1С": { 
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 25", 
      }, 
      "Цена": "30" 
    } 
  }, 
  "obratnaya_linya_rezervnogo_kotla_name": { 
    "Короткая посадочное": { 
      "Значение резьбы": "G ¾\"", 
      "Диаметр отверстия": 25, 
      "Подходящая номенклатура из 1С": { 
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 25", 
      }, 
      "Цена": "30" 
    } 
  }, 
} 
 
var res = Object.values(data).reduce((result, val) => { 
  var obj = val["Короткая посадочное"]; 
  // для случае если имя "Короткая посадочное" может меняться 
  // var obj = Object.values(val)[0]; 
  // либо с помощью `for` 
  // var obj; 
  // for(var i in val) { 
  //   obj = val[i]; 
  //   break; 
  //} 
  var key = obj["Подходящая номенклатура из 1С"]["Наименование"]; 
  if (!result[key]) { 
    result[key] = { 
      'Количество вхождений в объекте': 1, 
      "Значение резьбы": obj["Значение резьбы"], 
      'Цена': obj['Цена'], 
    }; 
  } else { 
    result[key]['Количество вхождений в объекте'] += 1; 
  } 
  return result; 
}, {}); 
 
console.log(res);

Answer 2

var data = { 
  "podauschaya_linya_1_kontura_name": { 
    "Короткая посадочное": { 
      "Значение резьбы": "G 1\"", 
      "Диаметр отверстия": 30, 
      "Подходящая номенклатура из 1С": { 
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30", 
      }, 
      "Цена": "36" 
    } 
  }, 
  "podauschaya_linya_2_kontura_name": { 
    "Короткая посадочное": { 
      "Значение резьбы": "G 1\"", 
      "Диаметр отверстия": 30, 
      "Подходящая номенклатура из 1С": { 
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 30", 
      }, 
      "Цена": "36" 
    } 
  }, 
  "podauschaya_linya_rezervnogo_kotla_name": { 
    "Короткая посадочное": { 
      "Значение резьбы": "G ¾\"", 
      "Диаметр отверстия": 25, 
      "Подходящая номенклатура из 1С": { 
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 25", 
      }, 
      "Цена": "30" 
    } 
  }, 
  "obratnaya_linya_rezervnogo_kotla_name": { 
    "Короткая посадочное": { 
      "Значение резьбы": "G ¾\"", 
      "Диаметр отверстия": 25, 
      "Подходящая номенклатура из 1С": { 
        "Наименование": "Стоимость сверления отверстия AISI 304 (толщ. 2 мм.) 25", 
      }, 
      "Цена": "30" 
    } 
  }, 
}; 
var data1 = {}; 
for (var key in data) { 
  var subkey = Object.keys(data[key])[0]; 
  var key1 = data[key][subkey]["Подходящая номенклатура из 1С"]["Наименование"]; 
  if (data1[key1]) { 
    data1[key1]["Количество вхождений в объекте"] += 1; 
  } else { 
    data1[key1] = { 
      "Количество вхождений в объекте": 1, 
      "Значение резьбы": data[key][subkey]["Значение резьбы"], 
      "Цена": data[key][subkey]["Цена"]  
    }; 
  } 
} 
console.log(data1);

READ ALSO
sequelize без ассоциации

sequelize без ассоциации

Подскажите пожалуйста

142
Как привязать autonumeric ко всем элементам

Как привязать autonumeric ко всем элементам

Не могу разобраться, autoNumeric работает только на первый элемент содержащий класс float, как сделать что бы сработало на всех элементах имеющих...

126
Воспроизвести 2+ видео на странице kurento

Воспроизвести 2+ видео на странице kurento

Возможно ли запустить 2 PlayerEndpoint с разными ссылками на одной странице? https://doc-kurentoreadthedocs

119