parent
							
								
									85298e345d
								
							
						
					
					
						commit
						502dd89290
					
				| @ -23,7 +23,8 @@ const I18N_DATA_EXTRA_FOLDER = `${I18N_DATA_FOLDER}/extra`; | |||||||
| const RELATIVE_I18N_FOLDER = path.resolve(__dirname, `../../../${I18N_FOLDER}`); | const RELATIVE_I18N_FOLDER = path.resolve(__dirname, `../../../${I18N_FOLDER}`); | ||||||
| const RELATIVE_I18N_CORE_FOLDER = path.resolve(__dirname, `../../../${I18N_CORE_FOLDER}`); | const RELATIVE_I18N_CORE_FOLDER = path.resolve(__dirname, `../../../${I18N_CORE_FOLDER}`); | ||||||
| const RELATIVE_I18N_DATA_FOLDER = path.resolve(__dirname, `../../../${I18N_DATA_FOLDER}`); | const RELATIVE_I18N_DATA_FOLDER = path.resolve(__dirname, `../../../${I18N_DATA_FOLDER}`); | ||||||
| const RELATIVE_I18N_DATA_EXTRA_FOLDER = path.resolve(__dirname, `../../../${I18N_DATA_EXTRA_FOLDER}`); | const RELATIVE_I18N_DATA_EXTRA_FOLDER = | ||||||
|  |     path.resolve(__dirname, `../../../${I18N_DATA_EXTRA_FOLDER}`); | ||||||
| const DEFAULT_RULE = 'function anonymous(n\n/*``*/) {\nreturn"other"\n}'; | const DEFAULT_RULE = 'function anonymous(n\n/*``*/) {\nreturn"other"\n}'; | ||||||
| const EMPTY_RULE = 'function anonymous(n\n/*``*/) {\n\n}'; | const EMPTY_RULE = 'function anonymous(n\n/*``*/) {\n\n}'; | ||||||
| const WEEK_DAYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; | const WEEK_DAYS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; | ||||||
| @ -72,9 +73,12 @@ module.exports = (gulp, done) => { | |||||||
| 
 | 
 | ||||||
|     console.log(`${index + 1}/${LOCALES.length}`); |     console.log(`${index + 1}/${LOCALES.length}`); | ||||||
|     console.log(`\t${I18N_DATA_FOLDER}/${locale}.ts`); |     console.log(`\t${I18N_DATA_FOLDER}/${locale}.ts`); | ||||||
|     fs.writeFileSync(`${RELATIVE_I18N_DATA_FOLDER}/${locale}.ts`, locale === 'en'? localeEnFile : generateLocale(locale, localeData, baseCurrencies)); |     fs.writeFileSync( | ||||||
|  |         `${RELATIVE_I18N_DATA_FOLDER}/${locale}.ts`, | ||||||
|  |         locale === 'en' ? localeEnFile : generateLocale(locale, localeData, baseCurrencies)); | ||||||
|     console.log(`\t${I18N_DATA_EXTRA_FOLDER}/${locale}.ts`); |     console.log(`\t${I18N_DATA_EXTRA_FOLDER}/${locale}.ts`); | ||||||
|     fs.writeFileSync(`${RELATIVE_I18N_DATA_EXTRA_FOLDER}/${locale}.ts`, generateLocaleExtra(locale, localeData)); |     fs.writeFileSync( | ||||||
|  |         `${RELATIVE_I18N_DATA_EXTRA_FOLDER}/${locale}.ts`, generateLocaleExtra(locale, localeData)); | ||||||
|   }); |   }); | ||||||
|   console.log(`${LOCALES.length} locale files generated.`); |   console.log(`${LOCALES.length} locale files generated.`); | ||||||
| 
 | 
 | ||||||
| @ -82,13 +86,14 @@ module.exports = (gulp, done) => { | |||||||
|   const format = require('gulp-clang-format'); |   const format = require('gulp-clang-format'); | ||||||
|   const clangFormat = require('clang-format'); |   const clangFormat = require('clang-format'); | ||||||
|   return gulp |   return gulp | ||||||
|     .src([ |       .src( | ||||||
|       `${I18N_DATA_FOLDER}/**/*.ts`, |           [ | ||||||
|       `${I18N_FOLDER}/currencies.ts`, |             `${I18N_DATA_FOLDER}/**/*.ts`, `${I18N_FOLDER}/currencies.ts`, | ||||||
|       `${I18N_CORE_FOLDER}/locale_en.ts` |             `${I18N_CORE_FOLDER}/locale_en.ts` | ||||||
|     ], {base: '.'}) |           ], | ||||||
|     .pipe(format.format('file', clangFormat)) |           {base: '.'}) | ||||||
|     .pipe(gulp.dest('.')); |       .pipe(format.format('file', clangFormat)) | ||||||
|  |       .pipe(gulp.dest('.')); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -96,16 +101,16 @@ module.exports = (gulp, done) => { | |||||||
|  */ |  */ | ||||||
| function generateLocale(locale, localeData, baseCurrencies) { | function generateLocale(locale, localeData, baseCurrencies) { | ||||||
|   // [ localeId, dateTime, number, currency, pluralCase ]
 |   // [ localeId, dateTime, number, currency, pluralCase ]
 | ||||||
|   let data = stringify([ |   let data = | ||||||
|     locale, |       stringify( | ||||||
|     ...getDateTimeTranslations(localeData), |           [ | ||||||
|     ...getDateTimeSettings(localeData), |             locale, ...getDateTimeTranslations(localeData), ...getDateTimeSettings(localeData), | ||||||
|     ...getNumberSettings(localeData), |             ...getNumberSettings(localeData), ...getCurrencySettings(locale, localeData), | ||||||
|     ...getCurrencySettings(locale, localeData), |             generateLocaleCurrencies(localeData, baseCurrencies) | ||||||
|     generateLocaleCurrencies(localeData, baseCurrencies) |           ], | ||||||
|   ], true) |           true) | ||||||
|   // We remove "undefined" added by spreading arrays when there is no value
 |           // We remove "undefined" added by spreading arrays when there is no value
 | ||||||
|     .replace(/undefined/g, 'u'); |           .replace(/undefined/g, 'u'); | ||||||
| 
 | 
 | ||||||
|   // adding plural function after, because we don't want it as a string
 |   // adding plural function after, because we don't want it as a string
 | ||||||
|   data = data.substring(0, data.lastIndexOf(']')) + `, plural]`; |   data = data.substring(0, data.lastIndexOf(']')) + `, plural]`; | ||||||
| @ -120,7 +125,8 @@ export default ${data}; | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Generate a file that contains extra data (for now: day period rules, and extended day period data) |  * Generate a file that contains extra data | ||||||
|  |  * (for now: day period rules, and extended day period data) | ||||||
|  */ |  */ | ||||||
| function generateLocaleExtra(locale, localeData) { | function generateLocaleExtra(locale, localeData) { | ||||||
|   const dayPeriods = getDayPeriodsNoAmPm(localeData); |   const dayPeriods = getDayPeriodsNoAmPm(localeData); | ||||||
| @ -136,8 +142,7 @@ function generateLocaleExtra(locale, localeData) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const dayPeriodsFormat = removeDuplicates([ |     const dayPeriodsFormat = removeDuplicates([ | ||||||
|       objectValues(dayPeriods.format.narrow), |       objectValues(dayPeriods.format.narrow), objectValues(dayPeriods.format.abbreviated), | ||||||
|       objectValues(dayPeriods.format.abbreviated), |  | ||||||
|       objectValues(dayPeriods.format.wide) |       objectValues(dayPeriods.format.wide) | ||||||
|     ]); |     ]); | ||||||
| 
 | 
 | ||||||
| @ -243,13 +248,16 @@ export const CURRENCIES_EN: {[code: string]: CurrenciesSymbols | [string | undef | |||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Returns data for the chosen day periods |  * Returns data for the chosen day periods | ||||||
|  * @returns {format: {narrow / abbreviated / wide: [...]}, stand-alone: {narrow / abbreviated / wide: [...]}} |  * @returns { | ||||||
|  |  *   format: {narrow / abbreviated / wide: [...]}, | ||||||
|  |  *   stand-alone: {narrow / abbreviated / wide: [...]} | ||||||
|  |  * } | ||||||
|  */ |  */ | ||||||
| function getDayPeriods(localeData, dayPeriodsList) { | function getDayPeriods(localeData, dayPeriodsList) { | ||||||
|   const dayPeriods = localeData.main(`dates/calendars/gregorian/dayPeriods`); |   const dayPeriods = localeData.main(`dates/calendars/gregorian/dayPeriods`); | ||||||
|   const result = {}; |   const result = {}; | ||||||
|   // cleaning up unused keys
 |   // cleaning up unused keys
 | ||||||
|   Object.keys(dayPeriods).forEach(key1 => {          // format / stand-alone
 |   Object.keys(dayPeriods).forEach(key1 => {  // format / stand-alone
 | ||||||
|     result[key1] = {}; |     result[key1] = {}; | ||||||
|     Object.keys(dayPeriods[key1]).forEach(key2 => {  // narrow / abbreviated / wide
 |     Object.keys(dayPeriods[key1]).forEach(key2 => {  // narrow / abbreviated / wide
 | ||||||
|       result[key1][key2] = {}; |       result[key1][key2] = {}; | ||||||
| @ -275,13 +283,16 @@ function getDayPeriodsAmPm(localeData) { | |||||||
|  * Returns the extra day periods (without am/pm) |  * Returns the extra day periods (without am/pm) | ||||||
|  */ |  */ | ||||||
| function getDayPeriodsNoAmPm(localeData) { | function getDayPeriodsNoAmPm(localeData) { | ||||||
|   return getDayPeriods(localeData, ['noon', 'midnight', 'morning1', 'morning2', 'afternoon1', |   return getDayPeriods(localeData, [ | ||||||
|     'afternoon2', 'evening1', 'evening2', 'night1', 'night2']); |     'noon', 'midnight', 'morning1', 'morning2', 'afternoon1', 'afternoon2', 'evening1', 'evening2', | ||||||
|  |     'night1', 'night2' | ||||||
|  |   ]); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Returns date-related translations for a locale |  * Returns date-related translations for a locale | ||||||
|  * @returns [ dayPeriodsFormat, dayPeriodsStandalone, daysFormat, dayStandalone, monthsFormat, monthsStandalone, eras ] |  * @returns [ dayPeriodsFormat, dayPeriodsStandalone, daysFormat, dayStandalone, monthsFormat, | ||||||
|  |  * monthsStandalone, eras ] | ||||||
|  * each value: [ narrow, abbreviated, wide, short? ] |  * each value: [ narrow, abbreviated, wide, short? ] | ||||||
|  */ |  */ | ||||||
| function getDateTimeTranslations(localeData) { | function getDateTimeTranslations(localeData) { | ||||||
| @ -291,8 +302,7 @@ function getDateTimeTranslations(localeData) { | |||||||
|   const dayPeriods = getDayPeriodsAmPm(localeData); |   const dayPeriods = getDayPeriodsAmPm(localeData); | ||||||
| 
 | 
 | ||||||
|   const dayPeriodsFormat = removeDuplicates([ |   const dayPeriodsFormat = removeDuplicates([ | ||||||
|     objectValues(dayPeriods.format.narrow), |     objectValues(dayPeriods.format.narrow), objectValues(dayPeriods.format.abbreviated), | ||||||
|     objectValues(dayPeriods.format.abbreviated), |  | ||||||
|     objectValues(dayPeriods.format.wide) |     objectValues(dayPeriods.format.wide) | ||||||
|   ]); |   ]); | ||||||
| 
 | 
 | ||||||
| @ -303,22 +313,17 @@ function getDateTimeTranslations(localeData) { | |||||||
|   ]); |   ]); | ||||||
| 
 | 
 | ||||||
|   const daysFormat = removeDuplicates([ |   const daysFormat = removeDuplicates([ | ||||||
|     objectValues(dayNames.format.narrow), |     objectValues(dayNames.format.narrow), objectValues(dayNames.format.abbreviated), | ||||||
|     objectValues(dayNames.format.abbreviated), |     objectValues(dayNames.format.wide), objectValues(dayNames.format.short) | ||||||
|     objectValues(dayNames.format.wide), |  | ||||||
|     objectValues(dayNames.format.short) |  | ||||||
|   ]); |   ]); | ||||||
| 
 | 
 | ||||||
|   const daysStandalone = removeDuplicates([ |   const daysStandalone = removeDuplicates([ | ||||||
|     objectValues(dayNames['stand-alone'].narrow), |     objectValues(dayNames['stand-alone'].narrow), objectValues(dayNames['stand-alone'].abbreviated), | ||||||
|     objectValues(dayNames['stand-alone'].abbreviated), |     objectValues(dayNames['stand-alone'].wide), objectValues(dayNames['stand-alone'].short) | ||||||
|     objectValues(dayNames['stand-alone'].wide), |  | ||||||
|     objectValues(dayNames['stand-alone'].short) |  | ||||||
|   ]); |   ]); | ||||||
| 
 | 
 | ||||||
|   const monthsFormat = removeDuplicates([ |   const monthsFormat = removeDuplicates([ | ||||||
|     objectValues(monthNames.format.narrow), |     objectValues(monthNames.format.narrow), objectValues(monthNames.format.abbreviated), | ||||||
|     objectValues(monthNames.format.abbreviated), |  | ||||||
|     objectValues(monthNames.format.wide) |     objectValues(monthNames.format.wide) | ||||||
|   ]); |   ]); | ||||||
| 
 | 
 | ||||||
| @ -337,8 +342,7 @@ function getDateTimeTranslations(localeData) { | |||||||
|   const dateTimeTranslations = [ |   const dateTimeTranslations = [ | ||||||
|     ...removeDuplicates([dayPeriodsFormat, dayPeriodsStandalone]), |     ...removeDuplicates([dayPeriodsFormat, dayPeriodsStandalone]), | ||||||
|     ...removeDuplicates([daysFormat, daysStandalone]), |     ...removeDuplicates([daysFormat, daysStandalone]), | ||||||
|     ...removeDuplicates([monthsFormat, monthsStandalone]), |     ...removeDuplicates([monthsFormat, monthsStandalone]), eras | ||||||
|     eras |  | ||||||
|   ]; |   ]; | ||||||
| 
 | 
 | ||||||
|   return dateTimeTranslations; |   return dateTimeTranslations; | ||||||
| @ -352,10 +356,8 @@ function getDateTimeTranslations(localeData) { | |||||||
| function getDateTimeFormats(localeData) { | function getDateTimeFormats(localeData) { | ||||||
|   function getFormats(data) { |   function getFormats(data) { | ||||||
|     return removeDuplicates([ |     return removeDuplicates([ | ||||||
|       data.short._value || data.short, |       data.short._value || data.short, data.medium._value || data.medium, | ||||||
|       data.medium._value || data.medium, |       data.long._value || data.long, data.full._value || data.full | ||||||
|       data.long._value || data.long, |  | ||||||
|       data.full._value || data.full |  | ||||||
|     ]); |     ]); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -363,11 +365,7 @@ function getDateTimeFormats(localeData) { | |||||||
|   const timeFormats = localeData.main('dates/calendars/gregorian/timeFormats'); |   const timeFormats = localeData.main('dates/calendars/gregorian/timeFormats'); | ||||||
|   const dateTimeFormats = localeData.main('dates/calendars/gregorian/dateTimeFormats'); |   const dateTimeFormats = localeData.main('dates/calendars/gregorian/dateTimeFormats'); | ||||||
| 
 | 
 | ||||||
|   return [ |   return [getFormats(dateFormats), getFormats(timeFormats), getFormats(dateTimeFormats)]; | ||||||
|     getFormats(dateFormats), |  | ||||||
|     getFormats(timeFormats), |  | ||||||
|     getFormats(dateTimeFormats) |  | ||||||
|   ]; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -375,7 +373,8 @@ function getDateTimeFormats(localeData) { | |||||||
|  * @returns string[] |  * @returns string[] | ||||||
|  */ |  */ | ||||||
| function getDayPeriodRules(localeData) { | function getDayPeriodRules(localeData) { | ||||||
|   const dayPeriodRules = localeData.get(`supplemental/dayPeriodRuleSet/${localeData.attributes.language}`); |   const dayPeriodRules = | ||||||
|  |       localeData.get(`supplemental/dayPeriodRuleSet/${localeData.attributes.language}`); | ||||||
|   const rules = {}; |   const rules = {}; | ||||||
|   if (dayPeriodRules) { |   if (dayPeriodRules) { | ||||||
|     Object.keys(dayPeriodRules).forEach(key => { |     Object.keys(dayPeriodRules).forEach(key => { | ||||||
| @ -404,11 +403,11 @@ function getFirstDayOfWeek(localeData) { | |||||||
|  */ |  */ | ||||||
| function getWeekendRange(localeData) { | function getWeekendRange(localeData) { | ||||||
|   const startDay = |   const startDay = | ||||||
|     localeData.get(`supplemental/weekData/weekendStart/${localeData.attributes.territory}`) || |       localeData.get(`supplemental/weekData/weekendStart/${localeData.attributes.territory}`) || | ||||||
|     localeData.get('supplemental/weekData/weekendStart/001'); |       localeData.get('supplemental/weekData/weekendStart/001'); | ||||||
|   const endDay = |   const endDay = | ||||||
|     localeData.get(`supplemental/weekData/weekendEnd/${localeData.attributes.territory}`) || |       localeData.get(`supplemental/weekData/weekendEnd/${localeData.attributes.territory}`) || | ||||||
|     localeData.get('supplemental/weekData/weekendEnd/001'); |       localeData.get('supplemental/weekData/weekendEnd/001'); | ||||||
|   return [WEEK_DAYS.indexOf(startDay), WEEK_DAYS.indexOf(endDay)]; |   return [WEEK_DAYS.indexOf(startDay), WEEK_DAYS.indexOf(endDay)]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -417,13 +416,17 @@ function getWeekendRange(localeData) { | |||||||
|  * @returns [ firstDayOfWeek, weekendRange, formats ] |  * @returns [ firstDayOfWeek, weekendRange, formats ] | ||||||
|  */ |  */ | ||||||
| function getDateTimeSettings(localeData) { | function getDateTimeSettings(localeData) { | ||||||
|   return [getFirstDayOfWeek(localeData), getWeekendRange(localeData), ...getDateTimeFormats(localeData)]; |   return [ | ||||||
|  |     getFirstDayOfWeek(localeData), getWeekendRange(localeData), ...getDateTimeFormats(localeData) | ||||||
|  |   ]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Returns the number symbols and formats for a locale |  * Returns the number symbols and formats for a locale | ||||||
|  * @returns [ symbols, formats ] |  * @returns [ symbols, formats ] | ||||||
|  * symbols: [ decimal, group, list, percentSign, plusSign, minusSign, exponential, superscriptingExponent, perMille, infinity, nan, timeSeparator, currencyDecimal?, currencyGroup? ] |  * symbols: [ decimal, group, list, percentSign, plusSign, minusSign, exponential, | ||||||
|  |  * superscriptingExponent, perMille, infinity, nan, timeSeparator, currencyDecimal?, currencyGroup? | ||||||
|  |  * ] | ||||||
|  * formats: [ currency, decimal, percent, scientific ] |  * formats: [ currency, decimal, percent, scientific ] | ||||||
|  */ |  */ | ||||||
| function getNumberSettings(localeData) { | function getNumberSettings(localeData) { | ||||||
| @ -455,10 +458,7 @@ function getNumberSettings(localeData) { | |||||||
|     symbolValues.push(symbols.currencyGroup); |     symbolValues.push(symbols.currencyGroup); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   return [ |   return [symbolValues, [decimalFormat, percentFormat, currencyFormat, scientificFormat]]; | ||||||
|     symbolValues, |  | ||||||
|     [decimalFormat, percentFormat, currencyFormat, scientificFormat] |  | ||||||
|   ]; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -471,8 +471,9 @@ function getCurrencySettings(locale, localeData) { | |||||||
| 
 | 
 | ||||||
|   // find the currency currently used in this country
 |   // find the currency currently used in this country
 | ||||||
|   const currencies = |   const currencies = | ||||||
|     localeData.get(`supplemental/currencyData/region/${localeData.attributes.territory}`) || |       localeData.get(`supplemental/currencyData/region/${localeData.attributes.territory}`) || | ||||||
|     localeData.get(`supplemental/currencyData/region/${localeData.attributes.language.toUpperCase()}`); |       localeData.get( | ||||||
|  |           `supplemental/currencyData/region/${localeData.attributes.language.toUpperCase()}`); | ||||||
| 
 | 
 | ||||||
|   if (currencies) { |   if (currencies) { | ||||||
|     currencies.some(currency => { |     currencies.some(currency => { | ||||||
| @ -492,7 +493,8 @@ function getCurrencySettings(locale, localeData) { | |||||||
|   let currencySettings = [undefined, undefined]; |   let currencySettings = [undefined, undefined]; | ||||||
| 
 | 
 | ||||||
|   if (currentCurrency) { |   if (currentCurrency) { | ||||||
|     currencySettings = [currencyInfo[currentCurrency].symbol, currencyInfo[currentCurrency].displayName]; |     currencySettings = | ||||||
|  |         [currencyInfo[currentCurrency].symbol, currencyInfo[currentCurrency].displayName]; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   return currencySettings; |   return currencySettings; | ||||||
| @ -517,23 +519,21 @@ function getPluralFunction(locale) { | |||||||
|     fn = DEFAULT_RULE; |     fn = DEFAULT_RULE; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   fn = fn |   fn = fn.replace( | ||||||
|     .replace( |              toRegExp('function anonymous(n\n/*``*/) {\n'), | ||||||
|       toRegExp('function anonymous(n\n/*``*/) {\n'), |              'function plural(n: number): number {\n  ') | ||||||
|       'function plural(n: number): number {\n  ') |            .replace(toRegExp('var'), 'let') | ||||||
|     .replace(toRegExp('var'), 'let') |            .replace(toRegExp('if(typeof n==="string")n=parseInt(n,10);'), '') | ||||||
|     .replace(toRegExp('if(typeof n==="string")n=parseInt(n,10);'), '') |            .replace(toRegExp('\n}'), ';\n}'); | ||||||
|     .replace(toRegExp('\n}'), ';\n}'); |  | ||||||
| 
 | 
 | ||||||
|   // The replacement values must match the `Plural` enum from common.
 |   // The replacement values must match the `Plural` enum from common.
 | ||||||
|   // We do not use the enum directly to avoid depending on that package.
 |   // We do not use the enum directly to avoid depending on that package.
 | ||||||
|   return fn |   return fn.replace(toRegExp('"zero"'), ' 0') | ||||||
|     .replace(toRegExp('"zero"'), ' 0') |       .replace(toRegExp('"one"'), ' 1') | ||||||
|     .replace(toRegExp('"one"'), ' 1') |       .replace(toRegExp('"two"'), ' 2') | ||||||
|     .replace(toRegExp('"two"'), ' 2') |       .replace(toRegExp('"few"'), ' 3') | ||||||
|     .replace(toRegExp('"few"'), ' 3') |       .replace(toRegExp('"many"'), ' 4') | ||||||
|     .replace(toRegExp('"many"'), ' 4') |       .replace(toRegExp('"other"'), ' 5'); | ||||||
|     .replace(toRegExp('"other"'), ' 5'); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
| @ -562,7 +562,7 @@ function objectValues(obj) { | |||||||
|  */ |  */ | ||||||
| function removeDuplicates(data) { | function removeDuplicates(data) { | ||||||
|   const dedup = [data[0]]; |   const dedup = [data[0]]; | ||||||
|   for(let i = 1; i < data.length; i++) { |   for (let i = 1; i < data.length; i++) { | ||||||
|     if (stringify(data[i]) !== stringify(data[i - 1])) { |     if (stringify(data[i]) !== stringify(data[i - 1])) { | ||||||
|       dedup.push(data[i]); |       dedup.push(data[i]); | ||||||
|     } else { |     } else { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user