【问题标题】:how to call an array of keys from an array of objects?如何从对象数组中调用键数组?
【发布时间】:2015-09-01 16:54:20
【问题描述】:

如果我有以下数组

someArray = [{id: 1, coordinates: {latitude: 1212, longitude: 13324}},{id: 2, coordinates: {latitude: 1314, longitude: 15151}}]

无论如何都可以调用someArray,所以我只得到坐标键的数组而不必创建一个新数组? someArray.coordinates 给了我未定义的。 预期输出:

[{latitude: 1212, longitude: 13324}, {latitude: 1314, longitude: 15151}] 

【问题讨论】:

  • 数组(区别于对象)由数字索引访问,而不是字符串。
  • 给出那个对象数组,你期望得到什么输出?每个对象的coordinates 对象中的键列表?还是这些对象的坐标数组?
  • 如果你在回答我的评论,请edit你的问题在那里添加预期的输出,希望人们更有可能看到它。
  • @MattBall 不完全准确。都是字符串。数字只是转换为字符串,但它们仍然是字符串。
  • 只是为了让您了解一些混淆,您说您想要获取“密钥”,而实际上您想要放置每个 coordinates 密钥的 “值”进入一个新的数组。

标签: javascript arrays node.js


【解决方案1】:

您可以为此使用Array#mapspecMDN):

someArray = someArray.map(function(entry) {
    return entry.coordinates;
});

Array#map 从传入的迭代函数返回的条目生成一个新数组。

实例

var someArray = [{id: 1, coordinates: {latitude: 1212, longitude: 13324 }}, {id: 2, coordinates: {latitude: 1314,longitude: 15151}}];
snippet.log("Before:");
snippet.log(JSON.stringify(someArray));
someArray = someArray.map(function(entry) {
    return entry.coordinates;
});
snippet.log("After:");
snippet.log(JSON.stringify(someArray));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

【讨论】:

  • 他添加到问题中的预期输出比评论更有意义。我想这就是他所追求的。
  • @squint:大声笑,谢谢——我的第一个回答做到了!但后来我意识到我没有按照他的要求去做。 :-) 将恢复。
  • 该死,不能只是还原,必须重新输入(在窗口内)。
  • @T.J.Crowder 但不是真的retype,对吧?你可以复制第一个版本的source
  • @Xufox:不,真的要重新输入——我说的是那个之前。我意识到我没有制作他在评论中所说的内容(但有趣的是,制作了他真正想要的内容)并进行了编辑,它变成了忍者编辑。所以它现在已经消失了。
【解决方案2】:

您可以尝试使用地图功能:

someArray.map(function(current, index, array){ array[index] = current.coordinates});

不过,这会修改您的原件。您可以将其作为另一个数组获取,例如:

var coordinates = [];
someArray.map(function(current){coordinates.push(current.coordinates)});

是的,对不起,我忘了,最简单的是:

var coordinates = someArray.map(function(current) { return current.coordinates; });

或者你可以自己写:

function getCoordinates(objectArray) {
   var coordinates = [];
   for (var i in objectArray) {
      var current = objectArray[i];
      coordinates.push(current.coordinates);
   }
}

var onlyCoordinates = getCoordinates(someArray);

【讨论】:

  • 你不太了解如何使用.map()。使用.forEach(),您的方法会更有意义。使用.map(),您从回调中返回一个值,最后,.map() 返回一个包含这些值的新数组。
【解决方案3】:

已编辑:只需使用以下 sn-p

var someArray = [{id: 1, coordinates: {latitude: 1212, longitude: 13324}},{id: 2, coordinates: {latitude: 1314, longitude: 15151}}];

var i = -1;
while(someArray[++i]){
   someArray[i] = someArray[i].coordinates;
}

document.write("<pre>"+JSON.stringify(someArray,0,3)+"</pre>");

【讨论】:

  • 这不是他想要的。即使是这样,我也不知道你为什么要这样做,因为你可以创建一个循环遍历原始数组的函数。您还可以使用(和填充)ECMAScript 6 Array.prototype.find()
  • 是的,他想要没有新数组。但是,如果 id 与 someArray=[{id:4, coordinates:{}}, {id:9, coorditanes:{}}]map() 不同,如何找到项目。我的回答中只有indexOf()(我再次更新了)。
  • 另外,Array.prototype.find()developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 中只使用循环(for (var i = 0; i &lt; length; i++) {)
  • 根据我的经验,null, undefind, [], "" 和推送数组发生了很多错误(isEmptypushArray 修复了这些问题)
  • 我知道.find() 使用循环。为什么这很重要?他可以做var o = someArray.find(function(obj) { return obj.id == 5; }); console.log(o &amp;&amp; o.coordinates); 简单得多。但是,如果您查看问题中的预期结果,他确实想要一个数组。他的意思是他不想在代码中写一个单独的数组。
猜你喜欢
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2022-07-20
  • 1970-01-01
  • 2020-06-08
  • 2018-12-01
相关资源
最近更新 更多