Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向对象数组添加新特性(基于现有特性值指定特定值)_Javascript_Arrays_Object - Fatal编程技术网

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;
})