Programing

정의되지 않은 경우 자동으로 개체 생성

lottogame 2020. 11. 27. 07:35
반응형

정의되지 않은 경우 자동으로 개체 생성


이미 존재하지 않는 경우 객체에 속성을 자동으로 추가하는 쉬운 방법이 있습니까?

다음 예를 고려하십시오.

var test = {}
test.hello.world = "Hello doesn't exist!"

hello정의되지 않았기 때문에 작동하지 않습니다 .

내가 이것을 묻는 이유는 내가 이미 가지고 있는지 아닌지 알 수없는 기존 객체가 있기 때문 hello입니다. 실제로 내 코드의 다른 부분에 이러한 객체가 많이 있습니다. 항상 hello존재 하는지 확인 하고 다음과 같은 새 객체를 생성하지 않는지 확인하는 것은 매우 성가신 일입니다 .

var test = {}
if(test.hello === undefined) test.hello = {}
test.hello.world = "Hello World!"

hello이 예제에서 와 같이 자동으로 개체를 만드는 방법 이 있습니까?

나는 PHP에서 다음과 같은 것을 의미합니다.

$test = array();  
$test['hello']['world'] = "Hello world";   
var_dump($test);

산출:

array(1) {
  ["hello"]=>
  array(1) {
    ["world"]=>
    string(11) "Hello world"
  }
}

Ok 그것은 배열이지만 js 배열에서는 객체와 동일한 문제입니다.


var test = {};
test.hello = test.hello || {};
test.hello.world = "Hello world!";

test.hello정의되지 않은 경우 빈 개체로 설정됩니다.

test.hello이전에 정의 된 경우 변경되지 않습니다.

var test = {
  hello : {
    foobar : "Hello foobar"
  }
};

test.hello = test.hello || {};
test.hello.world = "Hello World";

console.log(test.hello.foobar); // this is still defined;
console.log(test.hello.world); // as is this.

새 개체

myObj = {};

재귀 함수

function addProps(obj, arr, val) {

    if (typeof arr == 'string')
        arr = arr.split(".");

    obj[arr[0]] = obj[arr[0]] || {};

    var tmpObj = obj[arr[0]];

    if (arr.length > 1) {
        arr.shift();
        addProps(tmpObj, arr, val);
    }
    else
        obj[arr[0]] = val;

    return obj;

}

점 표기된 문자열로 호출

addProps(myObj, 'sub1.sub2.propA', 1);

또는 배열

addProps(myObj, ['sub1', 'sub2', 'propA'], 1);

그리고 당신의 개체는 다음과 같이 보일 것입니다

myObj = {
  "sub1": {
    "sub2": {
      "propA": 1
    }
  }
};

비어 있지 않은 개체에서도 작동합니다!


Object속성을 반환하는 함수를 사용하여 의 프로토 타입을 확장 할 수 있지만 존재하지 않는 경우 먼저 추가합니다.

Object.prototype.getOrCreate = function (prop) {
    if (this[prop] === undefined) {
        this[prop] = {};
    }
    return this[prop];
};

var obj = {};

obj.getOrCreate("foo").getOrCreate("bar").val = 1;

JavaScript에는 객체에 대한 일반적인 getter / setter 메서드가 없기 때문에 일종의 함수 없이는이 작업을 수행 할 수 없습니다 (예 : Python에는 __getattr__). 한 가지 방법은 다음과 같습니다.

function add_property(object, key, value) {
    var keys = key.split('.');

    while (keys.length > 1) {
        var k = keys.shift();

        if (!object.hasOwnProperty(k)) {
            object[k] = {};
        }

        object = object[k];
    }

    object[keys[0]] = value;
}

정말로 원한다면 프로토 타입에 추가 할 수 있습니다 Object. 다음과 같이 호출 할 수 있습니다.

> var o = {}
> add_property(o, 'foo.bar.baz', 12)
> o.foo.bar.baz
12

다음은 프록시가있는 멋진 버전입니다.

const myUpsert = (input) => {
    const handler = {
        get: (obj, prop) => {
            obj[prop] = obj[prop] || {};
            return myUpsert(obj[prop]);
        }
    };
    return new Proxy(input, handler);
};

그리고 다음과 같이 사용합니다.

myUpsert(test).hello.world = '42';

This will add all the missing properties as empty objects, and leave the existing ones untouched. It's really just a proxied version of the classic test.hello = test.hello || {}, albeit much slower (See benchmark here.) But it's also much nicer to look at, especially if you'll be doing it more than one level deep. I wouldn't pick it for performance-heavy data crunching, but it's probably fast enough for a front-end state update (as in Redux).

Note that there's some implicit assumptions here:

  1. The intervening properties are either objects or non-existent. This will choke if test.hello is a string, for example.
  2. That you always want to be doing this for as long as you're using the Proxy instead of the original object.

These are pretty easily mitigated if you only use it in well-bounded contexts (like a reducer body) where there's little chance of accidentally returning the Proxy, and not much else you would want to do with the object.


var test = {}
if(!test.hasOwnProperty('hello')) {
    test.hello = {};
}
test.hello.world = "Hello World!"

This will add a property hello whose value is {world: 'Hello world!'} to the test object, if it doesn't exist. If you have a lot of these objects, you can just iterate over them and apply this function. Note: uses lodash.js

var test = {};
_.defaults(test, { hello: {world: 'Hello world!'} });    

Which is actually a convenience method for saying:

var defaults = _.partialRight(_.assign, function(a, b) {
  return typeof a == 'undefined' ? b : a;
});        
defaults(test, { hello: {world: 'Hello world!'} });

Note: _.defaults uses loops to achieve the same thing as the second block.

P.S. Checkout https://stackoverflow.com/a/17197858/1218080


I've come up with something, really custom as well, but it works as far as I have tested.

function dotted_put_var(str,val) {
    var oper=str.split('.');
    var p=window;
    for (var i=0;i<oper.length-1;i++) {
        var x=oper[i];
        p[x]=p[x]||{};
        p=p[x];
    }
    p[oper.pop()]=val;
}

Then, a complex variable can be set like this, ensuring that every links will be created if not already:

dotter_put_var('test.hello.world', 'testvalue'); // test.hello.world="testvalue";

See this working FIDDLE.


var test = {}
test.hello.world = "Hello doesn't exist!"

This will throw an error obviously as you didn't defined the test.hello

Firstly you need to need define the hello key then inside you can assign any key. But if you want to create key if not exists then you can do following thing

test.hello = test.hello || {};

The above statement will create the test.hello object if not defined and if it is defined then it will assign the same value as it is previously

Now you can assign any new key inside the test.hello

test.hello.world = "Everything works perfect";

test.hello.world2 = 'With another key too, it works perfect';

I use this:

Object.prototype.initProperty = function(name, defaultValue) {
  if (!(name in this)) this[name] = defaultValue;
};

You can later do f.e.:

var x = {a: 1};
x.initProperty("a", 2); // will not change property a
x.initProperty("b", 3); // will define property b
console.log(x); // => {a: 1, b: 3}

let test = {};
test = {...test, hello: {...test.hello, world: 'Hello does exist!'}};
console.log(test);

When using the spread operator, the value can be undefined, it'll automatically create an object.

참고URL : https://stackoverflow.com/questions/17643965/automatically-create-object-if-undefined

반응형