Javascript 向对象数组添加新特性(基于现有特性值指定特定值)
在对象数组中,我如何向特定对象添加具有特定值的新属性(基于特定对象的属性值之一)。哎呀。那是一口 例如,以下是一组对象:Javascript 向对象数组添加新特性(基于现有特性值指定特定值),javascript,arrays,object,Javascript,Arrays,Object,在对象数组中,我如何向特定对象添加具有特定值的新属性(基于特定对象的属性值之一)。哎呀。那是一口 例如,以下是一组对象: var data = [ {"label":"event1","name":"Red Total","count":220,}, {"label":"event2","name":"Green Total","count":330,}, {"label":"event3","name":"Blue Total","count":440,}, {
var data = [
{"label":"event1","name":"Red Total","count":220,},
{"label":"event2","name":"Green Total","count":330,},
{"label":"event3","name":"Blue Total","count":440,},
{"label":"overlap1","name":"Red","count":200,},
{"label":"overlap2","name":"Green","count":300}
]
所有这些对象都应该获得两个新属性:x
和y
。我知道,值为event1
的标签应始终分配x
为0.5
和y
为0.75
。我知道,值为event2
的标签应始终分配x
为1/3
和y
为0.235
等。。。下面是我想要的结果
var data = [
{"label":"event1","name":"Red Total","count":220,"x":0.5,"y":0.75},
{"label":"event2","name":"Green Total","count":330,"x":0.333,"y":0.235},
{"label":"event3","name":"Blue Total","count":440,"x":0.666,"y":0.235},
{"label":"overlap1","name":"Red","count":200,"x":0.9,"y":0.9},
{"label":"overlap2","name":"Green","count":300,"x":0.9,"y":0.9}
]
x和y值还没有存储在任何特定的位置或格式中,它们只是已知的,因此是完全灵活的
想法1:也许它们应该存储为另一个对象数组,并将标签作为公共键,然后根据该键的值以某种方式合并这两个对象?我不知道
var xAndY = [
{"label":"event1","x":0.5,"y":0.75},
{"label":"event2","x":0.333,"y":0.235}
}
想法2:或者将它们存储为成对数组
var xAndY = [
[0.333,0.75],
[0.666,0.235]
}
更多上下文:我也不总是知道哪些对象将在数组中。有时会出现event1
,event2
,event3
。有时,只有event1
和event2
。所以,我在想某种if
语句。与想法1类似(用简单的语言):
或想法2
if label = event1, add these new properties x:xAndY[0][0] and y:xAndY[0][1]
if label = event2, add these new properties x:xAndY[1][0] and y:xAndY[1][1]
显然,我不知道如何处理这个问题。谢谢你给我的指导。根据你的想法1你可以将x和y值存储为JavaScript对象,对象键是数据数组中的不同标签。然后,您可以遍历(对象的)数据数组,如果标签存在,则从x_和y对象分配x和y值(参见下面的示例)
另请参见此JSFiddle:这可能是一个很好的使用场所(可能通过lodash或下划线):
啊,很好的使用,这是地图的一个很好的例子。这使得我发布的代码解决方案更加简洁。唯一需要注意的是,如果有任何标签不在valueMap
中,并且您尝试访问它们的x和y值,则会抛出一个错误。因此,您可能需要额外检查它们是否存在。@dnak感谢您提醒注意事项。在我的特殊情况下,这是可以的,但是对于其他可能阅读本文的人来说,很高兴知道。谢谢,这个解决方案非常有效,谢谢JSFIDLE。我同意你的意见,使用地图更干净。
if label = event1, add these new properties x:xAndY[0][0] and y:xAndY[0][1]
if label = event2, add these new properties x:xAndY[1][0] and y:xAndY[1][1]
var x_and_ys = {"event1": {"x": 0.5, "y": 0.75},
"event2": {"x": 0.333, "y": 0.235}};
data.forEach(function (arrEntry, index) {
if (x_and_ys[arrEntry["label"]] !== undefined) {
for (var x_or_y in x_and_ys[arrEntry["label"]]) {
arrEntry[x_or_y] = x_and_ys[arrEntry["label"]][x_or_y];
}
}
});
var data = [
{"label":"event1","name":"Red Total","count":220,},
{"label":"event2","name":"Green Total","count":330,},
{"label":"event3","name":"Blue Total","count":440,},
{"label":"overlap1","name":"Red","count":200,},
{"label":"overlap2","name":"Green","count":300}
]
var valueMap = {
event1: {
x: 0.5,
y: 0.75
},
event2: {
x: 1,
y: 2
},
event3: {
x: 2,
y: 4
},
overlap1: {
x: 6,
y: 3
},
overlap2: {
x: 0.3,
y: 0.1
}
}
var fullData = data.map(function(el) {
var values = valueMap[el.label];
el.x = values.x;
el.y = values.y;
return el;
})