将Javascript对象和子项转换为对象数组 - lodash

时间:2016-06-03 17:17:27

标签: javascript arrays object lodash

我希望改变一些数据的结构。以下是我收到的数据样本

.window_handles(function(result) {     // Since two windows are open we need to get the window ids
    var temp = result.value[0];          //
    this.switchWindow(temp);             // and switch focus to the new window so that the next command is run against it
  })                                     //

我需要做的是将其转换为具有以下格式的数组:

{
  ID1: {
         firstName: 'John',
         lastName: 'Doe'
      },
  ID2: {
         firstName: 'Jane',
         lastName: 'Doe'
      }
}

如果可能,我更喜欢使用lodash

3 个答案:

答案 0 :(得分:5)

使用 Object.keys() Array#map() Object.keys() 有助于将对象的所有属性作为数组获取。然后 Array#map() 可用于迭代元素并根据返回的元素生成新数组。

var data = {
  ID1: {
    firstName: 'John',
    lastName: 'Doe'
  },
  ID2: {
    firstName: 'Jane',
    lastName: 'Doe'
  }
};

var res = Object.keys(data) // get all object properties as an array
  .map(function(k) { // iterate and generate new array with custom element
    return { // generate custom array object based on the property and object and return
      ID: k, // k is property of ov=bjeck
      firstName: data[k].firstName, // get inner properties from data object using k
      larstName: data[k].lastName
    };
  })

console.log(res);

更新: 我创建了新对象而不是更新原始对象并返回它。如果更新原始对象不是问题,则向对象添加其他属性,并在 Array#map() 回调函数内返回引用。如果有任何数量的内部属性但它更新原始对象,则此方法有效。

var data = {
  ID1: {
    firstName: 'John',
    lastName: 'Doe'
  },
  ID2: {
    firstName: 'Jane',
    lastName: 'Doe'
  }
};

var res = Object.keys(data) // get all object properties as an array
  .map(function(k) { // iterate and generate new array with custom element
    data[k].ID = k; // add additional property
    return data[k]; // return the reference
  })

console.log(res);

或者如果你想维护对象并且有很多内部对象属性,那就做类似的事情。

var data = {
  ID1: {
    firstName: 'John',
    lastName: 'Doe'
  },
  ID2: {
    firstName: 'Jane',
    lastName: 'Doe'
  }
};

var res = Object.keys(data) // get all object properties as an array
  .map(function(k) { // iterate and generate new array with custom element
    var obj = { // create an object to return
      ID: k
    };
    for (var key in data[k]) // iterate over object property
      if (data[k].hasOwnProperty(key)) // check the object has the property 
        obj[key] = data[k][key]; // add property to the newly generated object
    return obj; // return the object
  })

console.log(res);

答案 1 :(得分:2)

您可以在对象中添加ID吗?如果是这样,那么可以通过以下方式轻松实现:

var arr = _.values(obj);

说明:

开发人员经常复制键内部值以避免许多问题。他们喜欢这样:

{
  ID1: {
         ID: ID1,
         firstName: 'John',
         lastName: 'Doe'
      },
  ID2: {
         ID: ID2
         firstName: 'Jane',
         lastName: 'Doe'
      }
}

然后只使用上面的一个命令,它只返回对象的值并创建一个数组。

如果它不适合您,那么您需要手动添加ID:

var arr = _.map(obj, function(value, key) {
  value[ID] = key;
  return value;
});

请注意,代码会更改原始对象,但在大多数情况下,这不是问题,但如果您需要避免这种情况,则需要:

var arr = _(obj)
  .clone()
  .map(obj, function(value, key) {
    value[ID] = key;
    return value;
  })
  .value();

答案 2 :(得分:0)

您可以使用map()将对象转换为数组,然后使用assign()附加ID键值,这也可以确保原始对象无法获取突变。

以下是ES6版本:

var result = _.map(data, (item, ID) => _.assign({ ID }, item));



var data = {
  ID1: {
         firstName: 'John',
         lastName: 'Doe'
      },
  ID2: {
         firstName: 'Jane',
         lastName: 'Doe'
      }
};

var result = _.map(data, (item, ID) => _.assign({ ID }, item));

console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.js"></script>
&#13;
&#13;
&#13;

这是es5版本:

var result = _.map(data, function(item, ID) { 
  return _.assign({ ID: ID }, item);
});