簡體   English   中英

在js中將數組中的所有鍵從下划線轉換為駝峰式

[英]Transform all keys in array from underscore to camel case in js

因此,我需要將數組中的所有鍵從下划線轉換為js中的駱駝空間。 那是在將表單發送到服務器之前我需要做的。 我正在使用Angular.js ,我想將其表示為過濾器(但在這種情況下,我認為它並不重要)。 無論如何,這是我創建的功能。

.filter('underscoreToCamelKeys', function () {
        return function (data) {

            var tmp = [];
            function keyReverse(array) {
                angular.forEach(array, function (value, key) {
                        tmp[value] = underscoreToCamelcase(key);
                });

                return tmp;
            }

            var new_obj = {};
            for (var prop in keyReverse(data)) {
                if(tmp.hasOwnProperty(prop)) {
                    new_obj[tmp[prop]] = prop;
                }
            }
            return new_obj;
        };

        function underscoreToCamelcase (string) {
            return string.replace(/(\_\w)/g, function(m){
                return m[1].toUpperCase();
            });
        }
    })

在這里,我將嘗試解釋它的工作原理,因為起初看起來很糟糕。

underscoreToCamelcase函數只是將underscoreToCamelcase任何字符串還原為大小寫,首字符除外(例如some_string => someString

因此,正如我之前說的,我應該將所有鍵都還原為駝峰式大小寫,但是正如您所知,我們不能簡單地編寫

date[key] = underscoreToCamelcase(key)

所以keyReverse函數返回一個還原數組,這是示例

some_key => value

將會

value => someKey

最后,我只是將鍵和值還原回去

someKey => value

但是,正如您已經理解的那樣,我遇到了一個問題,如果數組中存在相同的值,這些數據將消失

排列

some_key1 => valuesome_key2 => value

返回為

someKey2 => value

那我該如何解決呢? 我建議檢查這些值是否存在,以及是否添加一些特殊的子字符串,如下所示

some_key1 => valuesome_key2 => value

value => someKey1zx99value => someKey2

並最終將其解析為zx99,但我想我要瘋了……也許有人在這種情況下有更好的解決方案?

重要! 他們的主要問題不僅是將字符串轉換為駝峰式大小寫,還需要使用數組鍵!

如果使用現有庫進行camelCase轉換,則可以像這樣減少對象

import {camelCase} from 'lodash/string'

const camelCaseKeys = (obj) =>
  Object.keys(obj).reduce((ccObj, field) => ({
    ...ccObj,
    [camelCase(field)]: obj[field]
  }), {})
.filter('underscoreToCamelKeys', function () {
        return function (data) {

            var tmp = {};
            angular.forEach(data, function (value, key) {
                var tmpvalue = underscoreToCamelcase(key);
                tmp[tmpvalue] = value;
            });

            return tmp;
        };

        function underscoreToCamelcase (string) {
            return string.replace(/(\_\w)/g, function(m){
                return m[1].toUpperCase();
            });
        }
    })

感謝ryanlutgen

作為替代解決方案,您可以使用JSON.stringify方法的可選replacer參數。

var result = JSON.stringify(myVal, function (key, value) {

  if (value && typeof value === 'object') {
    var replacement = {};
    for (var k in value) {
      if (Object.hasOwnProperty.call(value, k)) {
        replacement[underscoreToCamelcase(k)] = value[k];
      }
    }
    return replacement;
  }

  return value;
});

當然,您將得到一個字符串,並且必須調用JSON.parse來獲取對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM