• Как изменить набор ключей в массиве?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Кого на что меняем, объект вида { 'старый ключ': 'новый ключ' }:

    const keys = {
      x: 'a',
      y: 'b',
      z: 'c',
    };

    Собираем новый массив:

    const renameKeys = (obj, keys) =>
      Object.fromEntries(Object
        .entries(obj)
        .map(([ k, v ]) => [ Object.hasOwn(keys, k) ? keys[k] : k, v ])
      );
    
    // или
    
    const renameKeys = (obj, keys) =>
      Object.keys(obj).reduce((acc, k) => (
        acc[keys[k] ?? k] = obj[k],
        acc
      ), {});
    
    
    const newArr = arr.map(n => renameKeys(n, keys));

    Обновляем существующий:

    function renameKeys(keys, obj) {
      for (const k in keys) {
        if (obj.hasOwnProperty(k)) {
          obj[keys[k]] = obj[k];
          delete obj[k];
        }
      }
    }
    
    
    arr.forEach(renameKeys.bind(null, keys));
    Ответ написан
    Комментировать
  • Как изменить набор ключей в массиве?

    @historydev Куратор тега JavaScript
    Редактирую файлы с непонятными расширениями
    Да тут решать нечего, но раз уш пентиум напрячь хочется, вот тебе ребус:

    map
    forEach
    Object
    Object.keys
    delete

    решение

    const data3 = [
      { x: 1, y: 2, z: 3 },
      { x: 4, y: 5, z: 6 },
      { x: 7, y: 8, z: 9 },
    ];
    
    const changeKeyses = (arr, new_keyses) => arr.map(obj => {
    	Object.keys(obj).forEach((key, i) => {
                let new_key = new_keyses[i];
      	    if (new_key !== undefined) {
        	        let val = obj[key];
                    delete obj[key];
                    obj[new_key] = val;
                }
            });
      
           return obj;
    });
    
    console.log(changeKeyses(data3, ["a", "b", "c"]));
    console.log(changeKeyses(data3, ["a", "b"]));
    console.log(changeKeyses(data3, ["a"]));

    Ответ написан
    Комментировать
  • Как заменить ключи во вложенных объектах?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Рекурсия есть:

    const replaceKeys = (value, replacer) =>
      value instanceof Object
        ? value instanceof Array
          ? value.map(n => replaceKeys(n, replacer))
          : Object.fromEntries(Object
              .entries(value)
              .map(n => [ replacer(n[0]), replaceKeys(n[1], replacer) ])
            )
        : value;
    
    
    const newObj = replaceKeys(obj, k => `${k}_upd`);

    Рекурсии нет:

    function replaceKeys(value, replacer) {
      const stack = [];
      const clones = new Map;
      const getClone = val => val instanceof Object
        ? (clones.has(val) || stack.push([ val, clones.set(val, val.constructor()).get(val) ]),
           clones.get(val))
        : val;
    
      for (getClone(value); stack.length;) {
        const [ source, target ] = stack.pop();
        const isArray = Array.isArray(source);
        for (const k in source) if (Object.hasOwn(source, k)) {
          target[isArray ? k : replacer(k)] = getClone(source[k]);
        }
      }
    
      return getClone(value);
    }
    Ответ написан
    Комментировать
  • Где попрактиковаться с табличными данными, как Pandas, в JS?

    alsolovyev
    @alsolovyev
    ¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
    А что вам мешает взять задачи для питоновской Pandas'ы? google.com
    Поиск выдает репы с задачками и решения к ним. Код на python вам не нужен, но output посмотреть можно.
    Решайте задачи - сверяйте output:
    https://github.com/aakankshaws/Pandas-exercises
    https://github.com/guipsamora/pandas_exercises
    https://github.com/tommyod/awesome-pandas
    https://medium.com/%40foklacu/the-ultimate-collect...

    ps на крайний случай можно конвертировать код из python в js, если совсем какие-то проблемы появились с задачей
    Ответ написан
    1 комментарий