Сопоставление 2 массивов по идентификаторам (пользователь [идентификатор пользователя в качестве ключа] с заказами [значение массива идентификаторов заказов]) - PullRequest
2 голосов
/ 10 апреля 2019

У меня есть массив «пользователей» и массив «заказов». Я хочу перечислить все order_ids для каждого user_id.

var users = {
    0: {
        user_id: 111,
        user_name: "user111",
        isActive: 0
    },
    1: {
        user_id: 112,
        user_name: "use112",
        isActive: 1
    },
    2: {
        user_id: 113,
        user_name: "use113",
        isActive: 0
    },
    ...
}; 

var orders = {  
    888: {
        order_id: 888, 
        user_id: 111
    }, 
    889: {
        order_id: 889, 
        user_id: 111
    }, 
    890: {
        order_id: 890, 
        user_id: 113
    }
};

Какова наилучшая практика (с точки зрения эффективности), чтобы получить мне этот результат user_ids (user_id в качестве ключа) для заказов (значение массива orders ids):

result = {
    111: [ 888, 889 ],
    113: [ 890 ]
};

Использование объекта / массива "пользователь" является обязательным, поскольку моя переменная пользователя представляет собой отфильтрованный список пользователей, а массив userToOrder должен извлечь все order_ids некоторых конкретных пользователей и создать из них новый объект.

  • Нет для циклов, просто функциональность es6.
  • Попытка избежать .forEach() для этой практики, если это невозможно.
  • нет ответов на нагрузку, если только не пример "vanilla es6".

Это были мои последние попытки, но безуспешно:

let userToOrdersArray = users.map( function(user) {

    /*Object.values(orders).reduce((newObj, orderData) => {
        newObj[user.user_id][] = orderData.order_id;
    }, {});*/

    Object.values(orders).filter(function(orderData) {
        return (orderData.user_id === user.user_id); 
    });

});

console.log(userToOrdersArray); 

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

Я предполагаю, что для объекта users ключ всегда равен свойству user_id.

const users = {
  111: {
    user_id: 111,
    user_name: "user111",
    isActive: 0
  },
  112: {
    user_id: 112,
    user_name: "use112",
    isActive: 1
  },
  113: {
    user_id: 113,
    user_name: "use113",
    isActive: 0
  },
};

const orders = {
  888: {
    order_id: 888,
    user_id: 111
  },
  889: {
    order_id: 889,
    user_id: 111
  },
  890: {
    order_id: 890,
    user_id: 113
  }
};

const groupOrdersByUsers = (usersArr, ordersArr) => usersArr.map(id => ({[id]: ordersArr.filter(({user_id}) => user_id == id)}));

console.log(groupOrdersByUsers(Object.keys(users), Object.values(orders)));
1 голос
/ 26 июня 2019

Это должно сработать

const users = {
    0: {
        user_id: 111,
        user_name: "user111",
        isActive: 0
    },
    1: {
        user_id: 112,
        user_name: "use112",
        isActive: 1
    },
    2: {
        user_id: 113,
        user_name: "use113",
        isActive: 0
    },
}

  
const orders = {  
  888: {
    order_id: 888, 
    user_id: 111
  }, 
  889: {
    order_id: 889, 
    user_id: 111
  }, 
  890: {
    order_id: 890, 
    user_id: 113
  }
}

const getOrderIdsFromUserId = (user_id, orders) =>
  Object.values(orders).reduce(
    (order_ids, order) => 
      order.user_id===user_id ? [order.order_id,...order_ids] : order_ids,
    []
  )

const f = (users, orders) =>
  Object.values(users).reduce(
    (y, user) => ({
      ...y,
      [user.user_id]: getOrderIdsFromUserId(user.user_id, orders),
    }),
    {},
  )

console.log(f(users, orders))
1 голос
/ 10 апреля 2019

Вы можете использовать метод Array#reduce.

var users = {
  111: {
    user_id: 111,
    user_name: "user111",
    isActive: 0
  },
  112: {
    user_id: 112,
    user_name: "use112",
    isActive: 1
  },
  113: {
    user_id: 113,
    user_name: "use113",
    isActive: 0
  },
};
var orders = {
  888: {
    order_id: 888,
    user_id: 111
  },
  889: {
    order_id: 889,
    user_id: 111
  },
  890: {
    order_id: 890,
    user_id: 113
  }
};


// get all property values
var res = Object.values(orders)
  // iterate over values
  .reduce(function(obj, { user_id, order_id }) { // extract  properios using Destructuring feature
    // check user id present in users array
    if (user_id in users) {
      // define array for ids if not defined previously
      obj[user_id] = obj[user_id] || [];
      // push value to array
      obj[user_id].push(order_id);
    }
    // return object
    return obj;
    // set initial value as object
  }, {})

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