对象分配键和值-如果值有效

时间:2018-07-12 06:23:51

标签: javascript object

我认为这是一个肮脏/不需要的问题。

我有对象名称 test ,我只是尝试分配键和值(如果值有效)。

在下面的示例中,x,y,z是变量,该变量有时是动态的,只有当我们获得值时。

下面的代码工作正常,但是每次检查值是否有效时我都会使用它,然后将键和值分配给对象。

我只是想检查一下添加密钥的聪明方法吗?

var test = {
    a: "1",
    b: "2"
}
var x = "3";
//here x value is dynamic, sometimes only we get value.
if (x) {
    test.c = x;
}

var y = "4";
//here y value is dynamic, sometimes only we get value.
if (y) {
    test.d = y;
}

var z = "5";
//here z value is dynamic, sometimes only we get value.
if (z) {
    test.e = z;
}

console.log(JSON.stringify(test));

4 个答案:

答案 0 :(得分:1)

如果像在代码中一样,测试在添加到对象之前始终检查该值是否为真,则可以使用Proxy

const test = {
    a: "1",
    b: "2"
};
const testProx = new Proxy(test, {
  set: (obj, prop, val) => {
    if (val) obj[prop] = val;
  }
});
testProx.c = 'foo';
testProx.d = null; // falsey, will fail the Proxy's test and will not be added to object
testProx.e = 'bar';
console.log(test);

如果您需要更复杂的验证(例如,针对不同键的条件不同),我建议您使一个由键索引的对象包含一个返回该键值是否有效的函数:

const test = {
    a: "1",
    b: "2"
};
// just an example of having different conditions, this is not DRY code:
const testConditions = {
  c: (v) => typeof v === 'string' && v[0] === 'c',
  d: (v) => typeof v === 'string' && v[0] === 'd',
  e: (v) => typeof v === 'string' && v[0] === 'e',
}

const testProx = new Proxy(test, {
  set: (obj, prop, val) => {
    if (testConditions[prop](val)) obj[prop] = val;
  }
});
testProx.c = 'ccc';
// does not start with 'd', will fail the Proxy's test and will not be added to object:
testProx.d = 'fff'; 
testProx.e = 'eee';
console.log(test);

答案 1 :(得分:0)

您可以使用以下简便方式编写它:

var x, y, z;

var test = {
  a: "1",
  b: "2",
  c: x || null,
  d: y || null,
  e: z || null
}
console.log(JSON.stringify(test));

请记住,x,y,z必须在您的test变量之前定义,否则您会得到类似Uncaught ReferenceError: x is not defined的错误。

您还可以使用以下语法对x,y,z变量进行更多类型检查:

var x, y, z;

var test = {
  a: "1",
  b: "2",
  c: (x == 3 ? x : null),
  d: y ? y : null,
  e: z ? z : null
}
console.log(JSON.stringify(test));

答案 2 :(得分:0)

如果它来自另一个变量,则可以遍历该变量并检查每个键是否为空,如果不是,则将其添加到测试变量中。

const main = {
x: 1,
y: 2,
z: 3
}

const test = {
a: 11,
b: 12,
c: 13
}

Object.keys(main).forEach((key) => {
if (main[key]) {
	test[key] = main[key]
}
});

console.log(test);

答案 3 :(得分:0)

由于您对问题的描述不太清楚,所以我假设是

  1. 您需要验证添加到对象中的每个值。
  2. 您最终将使用字符串化的对象进行进一步处理。
  3. 您需要自动设置值的键。

根据您的要求,您甚至可以使用代理执行相同的操作。

var test = {
	currentKey:0,
	add:function(val){
		if(val){
			this[String.fromCharCode('a'.charCodeAt()+(this.currentKey++))]=val;
		}
	},
	toJSON:function(){
		let obj={...this};
		delete obj.currentKey;
		delete obj.toJSON;
		return obj;
    }
}

let x = 90;
test.add(90);

let y = null;
test.add(y);

let z = 89;
test.add(z);

console.log(JSON.stringify(test));