如果为null,如何分配属性

时间:2017-09-27 08:14:30

标签: javascript arrays lodash

我有一个带有重复ID的对象数组。与id关联的每个对象都具有属性A和属性B.对于每个循环,第一个索引数组的属性A具有值,但属性B为null。在第二个索引数组中,属性为null,属性B具有值。前两个索引将根据相同的id合并。输出不会为属性A和属性B生成值,但任何一个仍然为null。

阵列

 # In the PyDev Console, GUI control is done via hookable XML-RPC server
@staticmethod
def enable_gui(gui=qt4, app=None):
    """Switch amongst GUI input hooks by name.
    """

代码

{
 id: 123,
  A: “value A1”
  B: null
},
{
  id: 123,
   A: null,
   B: “value b”
},
{
  id: 123,
   A: “value A2”
   B: null
},
{
  id: 456,
   A: "a2 value",
   B: "b2 value"
}

输出

var output = _.groupBy(arr, function(o){
   return o.id;
})

预期

{
  id: 123,
  A: [“value A1”,“value A2”]
  B: null
},
{
  id: 456,
  A: ["a2 value"],
  B: "b2 value"
}

2 个答案:

答案 0 :(得分:1)

你可以在没有下划线和加载的情况下完成:

var arr = [
    {
        id: 123,
        A: "value A1",
        B: null
    },
    {
        id: 123,
        A: null,
        B: "value b"
    },
    {
        id: 123,
        A: "value A2",
        B: null
    },
    {
        id: 456,
        A: "a2 value",
        B: "b2 value"
    }    
];

var arr2 = arr.reduce((m, o) => {
    var sameObj = m.find(it => it.id === o.id);
    if (sameObj) {
        o.A && (sameObj.A.push(o.A));
        sameObj.B = sameObj.B || o.B;
    } else {
        o.A = o.A ? [o.A] : [];
        m.push(o);
    }
    return m;
}, []);

console.log(arr2);

答案 1 :(得分:0)

以下内容没有underscorelodash。只用香草JavaScript



var data = [{
    id: 123,
    A: "some value",
    B: null
  },
  {
    id: 123,
    A: null,
    B: "b value"
  },
  {
    id: 456,
    A: "a2 value",
    B: "b2 value"
  }
];

var outputObject = {},
  outputArray = [];

data.forEach(function(obj) {

  if (!outputObject[obj.id]) {
    outputObject[obj.id] = obj;
  } else {
    if (obj.B !== null) {
      outputObject[obj.id].B = obj.B;
    }
    if (obj.A !== null) {
      outputObject[obj.id].A = obj.A;
    }
  }

});

//Convert to an array
Object.keys(outputObject).forEach(function(key) {
  outputArray.push(outputObject[key]);
});

console.log(outputArray);