Упорядочить массив IP по специфике - PullRequest
0 голосов
/ 25 марта 2020

У меня есть массив IP-подсетей, и я хотел бы переставить массив по специфике Su bnet.

Например, у меня есть массив ниже:

var array = [['10.0.0.0/8', 'test1'], ['10.155.220.0/24', 'test2'], ['10.155.200.0/24', 'test3']];

Теперь я хочу изменить его так, чтобы он выглядел так:

var array = [['10.155.220.0/24', 'test2'], ['10.155.200.0/24', 'test3'], ['10.0.0.0/8', 'test1']];

В основном, 10.155.220.0/24 является более точным c su bnet, чем 10.0.0.0/8. Поэтому я хочу знать, смогу ли я расположить их по специфике, уточнив на первом месте c su bnet. В конечном счете, если это невозможно, могу ли я расположить их, просто взглянув на / 24 и / 8, с более высокого на более низкое число.

Приветствия

Ответы [ 3 ]

1 голос
/ 25 марта 2020

Попробуйте поискать JS Array.sort, и вы получите там, вот пример того, как я бы сделал. Я надеюсь, что это может помочь вам.

let array = [['10.0.0.0/8', 'test1'], ['10.155.220.0/24', 'test2'], ['10.155.200.0/24', 'test3']];

// Use the Array.sort function
console.log(array.sort(compareByMask))
console.log(array.sort(compareBySpecifity))

function compareByMask(item1, item2) {
    // Gets ther first element from item1 and item2
    let [full_ip1] = item1;
    let [full_ip2] = item2;

    // splits the element to get whatever comes after the '/'
    let mask1 = full_ip1.split('/')[1]
    let mask2 = full_ip2.split('/')[1]

    // A JS sort function must return an integer, here you can chose to do something like

    // if (mask1 < mask2) return 1 // It means that if 'mask1' is lesser than 'mask2', 'mask1' should appear first
    // else if (mask1 == mask2) return 0 // if they're the same, they must have the same position
    // else return -1 // Othewise 'mask1' must appear after 'mask2

    // Or how most people do
    return mask1 - mask2
}


function compareBySpecifity(item1, item2) {
    let [full_ip1] = item1;
    let [full_ip2] = item2;

    // Remove dots to turn IP into a number, a biger number means a more specific IP
    let ip1 = full_ip1.split('/')[0].replace(/\./g, '')
    let ip2 = full_ip2.split('/')[0].replace(/\./g, '')

    return ip2 - ip1

}
0 голосов
/ 25 марта 2020

Имеется функция для вычисления значения, которая может сравниваться в функции сортировки.

var data = [
  ["10.0.0.0/8", "test1"],
  ["10.155.220.0/24", "test2"],
  ["10.155.200.0/24", "test3"]
];

const value = ip => {
  const [addr, sub] = ip.split("/");
  return addr
    .split(".")
    .reduceRight((acc, curr) => acc * 10 + Number(curr), Number(sub));
};

data.sort(([a], [b]) => value(b) - value(a));

console.log(data);
0 голосов
/ 25 марта 2020

Таким образом, вы можете написать сортировку, в которой вы проверяете длину первого элемента массива, затем проверяете, совпадают ли обе длины, где мы проверяем, совпадают ли оба элемента сравнения, затем проверяем строки и сортируйте их соответственно!

var arr = [
  ['10.0.0.0/8', 'test1'],
  ['10.155.220.0/24', 'test2'],
  ['10.155.200.0/24', 'test3']
];

arr.sort((a, b) => {
  return (a[0].length < b[0].length) ? 1 :
    (a[0].length > b[0].length) ? -1 :
    (a[0] === b[0]) ? (a[1].localeCompare(b[1]) ? 1 : -1) :
    0;
});
console.log(arr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...