Используя Reduce в библиотеке Lodash, вы можете сделать следующее, где arr
- ваш входной массив.
_.reduce(arr, function(acc, val) { var k1 = val[0], k2 = val[1], val = val.slice(2); acc[k1] = acc[k1] || {}; acc[k1][k2] = val; return acc; }, {});
Я недавно желал поместить функциональность Перетаскивания в свой проект, и я не столкнулся с этой проблемой, но я заинтриговывался и действительно требовался, чтобы видеть, мог ли я придумать лучший метод, чем тот, описанный на странице, Вы связались с. Я надеюсь, что ясно понял все, что Вы хотели сделать, и в целом я думаю, что преуспел в том, чтобы решить проблему намного более изящным и простым способом.
На быстрой ноте стороны, для проблем как это было бы замечательно, если Вы предоставляете некоторый код, таким образом, мы видим точно, что это - Вы, пытаются сделать. Я говорю это только потому, что я принял несколько вещей о Вашем коде в моем решении... так, надо надеяться, это достаточно близко.
Вот код, который я объясню ниже:
this.LabelDrag.QueryContinueDrag += new System.Windows.Forms.QueryContinueDragEventHandler(this.LabelDrag_QueryContinueDrag);
this.LabelDrag.MouseDown += new System.Windows.Forms.MouseEventHandler(this.LabelDrag_MouseDown);
this.LabelDrag.MouseUp += new System.Windows.Forms.MouseEventHandler(this.LabelDrag_MouseUp);
this.LabelDrop.DragDrop += new System.Windows.Forms.DragEventHandler(this.LabelDrop_DragDrop);
this.LabelDrop.DragEnter += new System.Windows.Forms.DragEventHandler(this.LabelMain_DragEnter);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void LabelDrop_DragDrop(object sender, DragEventArgs e)
{
LabelDrop.Text = e.Data.GetData(DataFormats.Text).ToString();
}
private void LabelMain_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Text))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
private void LabelDrag_MouseDown(object sender, MouseEventArgs e)
{
//EXTREMELY IMPORTANT - MUST CALL LabelDrag's DoDragDrop method!!
//Calling the Form's DoDragDrop WILL NOT allow QueryContinueDrag to fire!
((Label)sender).DoDragDrop(TextMain.Text, DragDropEffects.Copy);
}
private void LabelDrag_MouseUp(object sender, MouseEventArgs e)
{
LabelDrop.Text = "LabelDrag_MouseUp";
}
private void LabelDrag_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
//Get rect of LabelDrop
Rectangle rect = new Rectangle(LabelDrop.Location, new Size(LabelDrop.Width, LabelDrop.Height));
//If the left mouse button is up and the mouse is not currently over LabelDrop
if (Control.MouseButtons != MouseButtons.Left && !rect.Contains(PointToClient(Control.MousePosition)))
{
//Cancel the DragDrop Action
e.Action = DragAction.Cancel;
//Manually fire the MouseUp event
LabelDrag_MouseUp(sender, new MouseEventArgs(Control.MouseButtons, 0, Control.MousePosition.X, Control.MousePosition.Y, 0));
}
}
}
я не учел большую часть кода разработчика, но включал код соединения Обработчика событий, таким образом, можно быть уверены, что связано с какой. В моем примере перетаскивание/отбрасывание происходит между, маркирует LabelDrag и LabelDrop.
основная часть моего решения использует событие QueryContinueDrag. Это событие стреляет, когда к изменениям клавиатуры или состояния мыши после DoDragDrop обратились то управление. Можно уже делать это, но очень важно, чтобы Вы назвали метод DoDragDrop управления, которое является Вашим источником а не методом, связанным с формой. Иначе QueryContinueDrag НЕ будет стрелять!
Одна вещь отметить состоит в том, что QueryContinueDrag будет на самом деле стрелять при выпуске мыши на управлении отбрасыванием , таким образом, мы должны удостовериться, что допускаем это. Это обрабатывается путем проверки, что Положение мыши (получил с глобальным Управлением. Свойство MousePosition), в прямоугольнике управления LabelDrop. Также, несомненно, необходимо будет преобразовать MousePosition в точку относительно Клиентского Окна с PointToClient как Управление. MousePosition возвращается экранный родственник положение.
Так путем проверки, что мышь не по управлению отбрасыванием и что кнопка мыши теперь , мы эффективно получили Событие mouseUp для управления LabelDrag!:) Теперь, Вы могли просто сделать любую обработку, Вы хотите сделать здесь, но если у Вас уже есть код, Вы используете в обработчике Событий mouseUp, это не эффективно. Поэтому просто назовите свое Событие mouseUp отсюда, передав его, необходимые параметры и обработчик MouseUp никогда не будут знать различия.
Просто примечание, хотя, как я называю DoDragDrop от в Обработчик события mouseDown в моем примере, этот код должен никогда на самом деле, заставляет прямое Событие mouseUp стрелять. Я просто поместил тот код там, чтобы показать, что возможно сделать это.
Hope, которая помогает!