繁体   English   中英

Javascript 方法未被调用

[英]Javascript method not being called

I am trying to understand the JS code for sorting hex colors in-order to convert it to java code in the library https://github.com/dagthomas/hexSorter The JS file which holds the logic for the package is below

module.exports = {
    hexValueSanitize: function(color) {
        return color.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i
        ,(m, r, g, b) => r + r + g + g + b + b).replace('#', '');
    },
    hexToDec: function(hex) {
        return parseInt((hex + '').replace(/[^a-f0-9]/gi, ''), 16);
    },
    decToHex: function(number) {
        return number < 0 ? 0xFFFFFFFF + number + 1 : parseInt(number, 10).toString(16);
    },
    hexToRgb: function(hex) {
        hex = this.hexValueSanitize(hex);
        return hex.length == 3 ? [this.hexToDec(hex[0] + hex[0]), this.hexToDec(hex[1] + hex[1]), this.hexToDec(hex[2] + hex[2])] : [this.hexToDec(hex[0] + hex[1]), this.hexToDec(hex[2] + hex[3]), this.hexToDec(hex[4] + hex[5])];
    },
    hexBrightness: function(hex, type) {
        let conversion;

        if (type == 'BT601') {
            conversion = [0.299, 0.587, 0.114]; //BT601
        } else if (type == 'BT709') {
            conversion = [0.2126, 0.7152, 0.0722]; //BT709
        } else if (type == 'BT2020') {
            conversion = [0.2627, 0.6780, 0.0593]; //BT2020
        } else {
            conversion = [0.299, 0.587, 0.114]; //BT601
        };

        hex = this.hexValueSanitize(hex);

        return (this.hexToDec(hex[0] + hex[1]) * conversion[0] + this.hexToDec(hex[2] + hex[3]) * conversion[1] + this.hexToDec(hex[4] + hex[5]) * conversion[2]);
    },
    rgbToHsv: function(color) {
        let r = color[0] / 255;
        let g = color[1] / 255;
        let b = color[2] / 255;

        let h,s,min,max,del,dR,dG,dB,hsl;

        hsl = [];

        min = Math.min(r, g, b);
        max = Math.max(r, g, b);
        del = max - min;

        if (del == 0) {
            h = 0;
            s = 0;
        } else {
            s = del / max;

            dR = (((max - r) / 6) + (del / 2)) / del;
            dG = (((max - g) / 6) + (del / 2)) / del;
            dB = (((max - b) / 6) + (del / 2)) / del;

            if (r == max) {
                h = dB - dG;
            } else if (g == max) {
                h = (1 / 3) + dR - dB;
            } else if (b == max) {
                h = (2 / 3) + dG - dR;
            };

            if (h < 0) {
                h++;
            };

            if (h > 1) {
                h--;
            };
        };

        hsl['h'] = h;
        hsl['s'] = s;
        hsl['v'] = 0.9;

        return hsl;
    },
    hexToHsv: function(hex) {
        let rgb, hsv;

        hex = this.hexValueSanitize(hex);

        rgb = this.hexToRgb(hex);
        hsv = this.rgbToHsv(rgb);

        return hsv;
    },
    mostBrightColor: function(colors, type) {
        let mostBright = false;
        let hex;

        colors.forEach((color) => {
            hex = this.hexValueSanitize(color);

            brightness = this.hexBrightness(hex, type);
            if (!mostBright || this.hexBrightness(hex, type) > this.hexBrightness(mostBright, type)) {
                mostBright = hex;
            };
        });

        return `#${mostBright}`;
    },
    mostSaturatedColor: function(colors) {
        let mostSaturated = false;
        let hex, hsv, saturation, oldHsv;

        colors.forEach((color) => {
            hex = this.hexValueSanitize(color);
            hsv = this.hexToHsv(hex);

            saturation = hsv['s'];

            if (mostSaturated) {
                oldHsv = this.hexToHsv(mostSaturated);
            };

            if (!mostSaturated || saturation > oldHsv['s']) {
                mostSaturated = hex;
            };
        });

        return `#${mostSaturated}`
    },
    colorMixer: function(hex1, hex2, percent) {
        hex1 = this.hexValueSanitize(hex1);
        hex2 = this.hexValueSanitize(hex2);

        if (hex1.length == 3) {
            hex1 = hex1.repeat(hex1[0], 2) + hex1.repeat(hex1[1], 2) + hex1.repeat(hex1[2], 2);
        };

        if (hex2.length == 3) {
            hex2 = hex2.repeat(hex2[0], 2) + hex2.repeat(hex2[1], 2) + hex2.repeat(hex2[2], 2);
        };

        let red_hex = this.decToHex((percent * this.hexToDec(hex1[0] + hex1[1]) + (100 - percent) * this.hexToDec(hex2[0] + hex2[1])) / 100).padStart(2, '0');
        let green_hex = this.decToHex((percent * this.hexToDec(hex1[2] + hex1[3]) + (100 - percent) * this.hexToDec(hex2[2] + hex2[3])) / 100).padStart(2, '0');
        let blue_hex =this.decToHex((percent * this.hexToDec(hex1[4] + hex1[5]) + (100 - percent) * this.hexToDec(hex2[4] + hex2[5])) / 100).padStart(2, '0');

        return `#${red_hex+green_hex+blue_hex}`;
    },
    sortColors: function(colors, type) {
        const input = colors.slice(0);
        const output = [];

        while (input.length > 0) {
          const color = this[type](input)
          let index = input.indexOf(color);
          if (index > -1) {
            input.splice(index, 1);
          }
          output.push(color)
        }
        return output
      },
      mixSortColors: function(colors, type, mixcolor, percentage) {
        const input = colors.slice(0)
        const output = []

        while (input.length > 0) {
          const color = this[type](input)
          let index = input.indexOf(color);
          if (index > -1) {
            input.splice(index, 1);
          }
          output.push(this.colorMixer(color, mixcolor, percentage))
        }
        return output
      }
}

这个脚本是从https://stackblitz.com/edit/hexsorter?file=index.js调用的,调用let sortedArray = hexSorter.sortColors(origArray, 'mostBrightColor'); 由 scipt 制成。 回到库代码,我看不到从sortColors调用库的任何其他方法,但 colors 正在根据亮度等进行排序。我不是 JavaScript 程序员,想了解如何调用其他方法,所以我可以将其复制到 Java 代码。

我看不到从 sortColors 调用库的任何其他方法

它就在那里:

const color = this[type](input)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM