массив для объекта с использованием ES6 [duplicate]

В matplotlib.basemap есть метод: is_land(xpt, ypt)

Он возвращает True, если заданная точка x, y (в координатах проецирования) находится над землей, False в противном случае. Определение земли основано на полигонах береговой линии GSHHS, связанных с экземпляром класса. Точки над озерами внутри земельных участков не считаются точками земли.

Для получения дополнительной информации см. здесь .

11
задан Kara 15 August 2017 в 17:27
поделиться

6 ответов

Я считаю, что это то, что вам нужно:

function deepen(o) {
  var oo = {}, t, parts, part;
  for (var k in o) {
    t = oo;
    parts = k.split('.');
    var key = parts.pop();
    while (parts.length) {
      part = parts.shift();
      t = t[part] = t[part] || {};
    }
    t[key] = o[k]
  }
  return oo;
}

Например:

> JSON.stringify(deepen({'ab.cd.e' : 'foo', 'ab.cd.f' : 'bar', 'ab.g' : 'foo2'}))`

"{"ab":{"cd":{"e":"foo","f":"bar"},"g":"foo2"}}"
22
ответ дан broofa 17 August 2018 в 09:39
поделиться
  • 1
    Я просто поставил более комплексное решение ниже: github.com/Gigzolo/dataobject-parser – Henry Tseng 6 March 2014 в 21:37
  • 2
    Это рискованно, если у вас есть свойство верхнего уровня с одинаковым именем. Оберните от t=oo; до t[key] = o[k] в if (k.indexOf('.') !== -1) ... – brandonscript 14 April 2014 в 20:14
  • 3
    Он также не работает, если у вас есть более одного ключа верхнего уровня. – brandonscript 14 April 2014 в 20:15

Вам нужно преобразовать каждый строковый ключ в объект. Используя следующую функцию, вы можете получить желаемый результат.

 function convertIntoJSON(obj) {

                var o = {}, j, d;
                for (var m in obj) {
                    d = m.split(".");
                var startOfObj = o;
                for (j = 0; j < d.length  ; j += 1) {

                    if (j == d.length - 1) {
                        startOfObj[d[j]] = obj[m];
                    }
                    else {
                        startOfObj[d[j]] = startOfObj[d[j]] || {};
                        startOfObj = startOfObj[d[j]];
                    }
                }
            }
            return o;
        }

Теперь вызовите эту функцию

 var aa = {
                'ab.cd.e': 'foo',
                'ab.cd.f': 'bar',
                    'ab.g': 'foo2'
                };
   var desiredObj =  convertIntoJSON(aa);
1
ответ дан Anoop 17 August 2018 в 09:39
поделиться

Получено из ответа Esailija с исправлениями для поддержки нескольких ключей верхнего уровня.

(function () {
    function parseDotNotation(str, val, obj) {
        var currentObj = obj,
            keys = str.split("."),
            i, l = Math.max(1, keys.length - 1),
            key;

        for (i = 0; i < l; ++i) {
            key = keys[i];
            currentObj[key] = currentObj[key] || {};
            currentObj = currentObj[key];
        }

        currentObj[keys[i]] = val;
        delete obj[str];
    }

    Object.expand = function (obj) {
        for (var key in obj) {
            if (key.indexOf(".") !== -1)
            {
                parseDotNotation(key, obj[key], obj);
            }            
        }
        return obj;
    };

})();

var obj = {
    "pizza": "that",
    "this.other": "that",
    "alphabets": [1, 2, 3, 4],
    "this.thing.that": "this"
}

Выходы:

{
    "pizza": "that",
    "alphabets": [
        1,
        2,
        3,
        4
    ],
    "this": {
        "other": "that",
        "thing": {
            "that": "this"
        }
    }
}

Fiddle

2
ответ дан Community 17 August 2018 в 09:39
поделиться

Название функции ужасно, и код был быстро создан, но он должен работать. Обратите внимание, что это изменяет исходный объект, я не уверен, что вы хотите создать новый объект, который является расширенной версией старого.

(function(){

    function parseDotNotation( str, val, obj ){
    var currentObj = obj,
        keys = str.split("."), i, l = keys.length - 1, key;

        for( i = 0; i < l; ++i ) {
        key = keys[i];
        currentObj[key] = currentObj[key] || {};
        currentObj = currentObj[key];
        }

    currentObj[keys[i]] = val;
    delete obj[str];
    }

    Object.expand = function( obj ) {

        for( var key in obj ) {
        parseDotNotation( key, obj[key], obj );
        }
    return obj;
    };

})();



var expanded = Object.expand({
    'ab.cd.e' : 'foo',
        'ab.cd.f' : 'bar',
    'ab.g' : 'foo2'
});



JSON.stringify( expanded );  


//"{"ab":{"cd":{"e":"foo","f":"bar"},"g":"foo2"}}"
4
ответ дан Esailija 17 August 2018 в 09:39
поделиться
  • 1
    Это замечательно, но работает только в том случае, если есть один ключ верхнего уровня. Если у вас есть {"foo":"bar", "foo.baz":"bar", "baz":"bar"}, он потеряет значение «baz». ключ. – brandonscript 14 April 2014 в 20:34

Если вы используете Node.js (например, если не вырезать и вырезать из нашего модуля), попробуйте этот пакет: https://www.npmjs.org/package/dataobject-parser

Построен модуль, который выполняет операции прямого / обратного действия:

https://github.com/Gigzolo/dataobject-parser

Он создан как объект, управляемый самостоятельно. Используется для экземпляра экземпляра DataObjectParser.

var structured = DataObjectParser.transpose({
    'ab.cd.e' : 'foo',
    'ab.cd.f' : 'bar',
    'ab.g' : 'foo2'
});                                                                                                                                                                                                                                                                                                                                                                                                                                                   

structured.data() возвращает ваш вложенный объект:

{ab: {cd: {e:'foo', f:'bar'}, g:'foo2'}}

Итак, вот рабочий пример в JSFiddle:

http://jsfiddle.net/H8Cqx/

6
ответ дан Henry Tseng 17 August 2018 в 09:39
поделиться

Что-то, что работает, но, вероятно, не самый эффективный способ сделать это (также полагается на метод ECMA 5 Object.keys (), но его можно легко заменить.

var input = {
    'ab.cd.e': 'foo',
    'ab.cd.f': 'bar',
    'ab.g': 'foo2'
};

function createObjects(parent, chainArray, value) {
    if (chainArray.length == 1) {
        parent[chainArray[0]] = value;
        return parent;
    }
    else {
        parent[chainArray[0]] = parent[chainArray[0]] || {};
        return createObjects(parent[chainArray[0]], chainArray.slice(1, chainArray.length), value);
    }
}

var keys = Object.keys(input);
var result = {};

for(var i = 0, l = keys.length; i < l; i++)
{
    createObjects(result, keys[i].split('.'), input[keys[i]]);
}

JSFiddle is здесь .

0
ответ дан ZenMaster 17 August 2018 в 09:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: