@visactor/vmind
Version:
<div align="center"> <a href="https://github.com/VisActor#gh-light-mode-only" target="_blank"> <img alt="VisActor Logo" width="200" src="https://github.com/VisActor/.github/blob/main/profile/logo_500_200_light.svg"/> </a> <a href="https://githu
135 lines (115 loc) • 4.49 kB
JavaScript
import { isFunction, isValidNumber } from "@visactor/vutils";
import dayjs from "dayjs";
import customParseFormat from "dayjs/plugin/customParseFormat";
dayjs.extend(customParseFormat);
export const sampleSize = (array, n) => {
const length = null === array ? 0 : array.length;
if (!length || n < 1) return [];
n = n > length ? length : n;
const randIndexs = [];
for (;randIndexs.length < n; ) {
const rand = Math.floor(Math.random() * length);
-1 === randIndexs.indexOf(rand) && randIndexs.push(rand);
}
return randIndexs.map((i => array[i]));
};
export const uniqBy = (array, key) => {
const seen = new Set;
return array.filter((item => {
const k = isFunction(key) ? key(item) : item[key];
return void 0 !== k && (!seen.has(k) && (seen.add(k), !0));
}));
};
export const isValidData = data => null != data && "null" !== data && "" !== data;
const dateFormats = [ {
key: "YYYY年MM月DD日",
regex: /^(\d{4})年(\d{1,2})月(\d{1,2})日$/,
format: (match, year, month, day) => `${year}-${month.padStart(2, "0")}-${day.padStart(2, "0")}`
}, {
key: "MM月DD日YYYY年",
regex: /^(\d{1,2})月(\d{1,2})日(\d{4})年$/,
format: (match, month, day, year) => `${year}-${month.padStart(2, "0")}-${year.padStart(2, "0")}`
}, {
key: "YYYY年MM月",
regex: /^(\d{4})年(\d{1,2})月$/,
format: (match, year, month) => `${year}-${month.padStart(2, "0")}`
}, {
key: "YYYY年",
regex: /^(\d{4})年$/,
format: (match, year) => `${year}`
}, {
key: "MM月",
regex: /^(\d{1,2})月$/,
format: (match, month) => `${month.padStart(2, "0")}`
}, {
key: "MM月DD日",
regex: /^(\d{1,2})月(\d{1,2})日$/,
format: (match, month, day) => `${month.padStart(2, "0")}-${day.padStart(2, "0")}`
} ];
function isQuarterDate(date) {
return [ /^\d{4}-Q[1-4]$/, /^\d{4}年第[一二三四]季度$/, /^Q[1-4]$/, /^\d{4}年-Q[1-4]$/ ].some((pattern => pattern.test(date)));
}
export function validateDate(date) {
const formaterDate = `${date}`.trim();
return dayjs(formaterDate).isValid() || dateFormats.find((v => "Invalid Date" !== new Date(formaterDate.replace(v.regex, v.format)).toString())) || isQuarterDate(formaterDate);
}
function convertQuarterToMonth(quarter) {
switch (quarter) {
case "Q1":
case "第一季度":
return "01-01";
case "Q2":
case "第二季度":
return "04-01";
case "Q3":
case "第三季度":
return "07-01";
case "Q4":
case "第四季度":
return "10-01";
default:
throw new Error("Invalid quarter");
}
}
export function convertStringToDateValue(stringDate) {
const date = `${stringDate}`.trim();
if (dayjs(date).isValid()) return date;
const validFormat = dateFormats.find((v => "Invalid Date" !== new Date(date.replace(v.regex, v.format)).toString()));
if (validFormat && validFormat.regex.test(date)) return date.replace(validFormat.regex, validFormat.format);
const patterns = [ {
regex: /^(\d{4})-Q([1-4])$/,
format: match => `${match[1]}-${convertQuarterToMonth("Q" + match[2])}`
}, {
regex: /^(\d{4})年第([一二三四])季度$/,
format: match => `${match[1]}-${convertQuarterToMonth(match[2] + "季度")}`
}, {
regex: /^Q([1-4])$/,
format: match => `${convertQuarterToMonth("Q" + match[1])}`
}, {
regex: /^(\d{4})年-Q([1-4])$/,
format: match => `${match[1]}-${convertQuarterToMonth("Q" + match[2])}`
} ];
for (const pattern of patterns) {
const match = date.match(pattern.regex);
if (match) return "function" == typeof pattern.format ? pattern.format(match) : date.replace(pattern.regex, pattern.format);
}
return date;
}
export function average(data, field) {
let sum = 0, count = 0;
data.forEach((x => {
const v = field ? +x[field] : +x;
isValidNumber(v) && (sum += v, count++);
}));
return sum / count;
}
export function getIntersection(array1, array2) {
return array1.filter((value => array2.includes(value)));
}
const KNOWLEDGE_START_INDEX = 1;
export const getStrFromArray = array => array.map(((item, index) => `${index + 1}. ${item}`)).join("\n");
export function findLastIndex(arr, predicate) {
for (let i = arr.length - 1; i >= 0; i--) if (predicate(arr[i], i, arr)) return i;
return -1;
}
//# sourceMappingURL=common.js.map