不使用 Object.entries() 返回键值对数组的数组

Posted

技术标签:

【中文标题】不使用 Object.entries() 返回键值对数组的数组【英文标题】:Return an array of arrays of key-value pairs WITHOUT using Object.entries() 【发布时间】:2020-04-18 23:02:25 【问题描述】:

我正在尝试编写一个函数,该函数接受一个对象并返回一个键值对数组的数组。我也不能使用Object.entries() 函数。

例如:var obj = a: 1, b: 2, c: 3 ; 我想返回:[["a",1], ["b",2], ["c",3]]

这是我目前所写的:

function entries(obj) 

var result = Object.keys(obj).map(function(key) 
  return [Number(key), obj[key]];
);

console.log(
  entries(obj = "1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0)
  );

但是,此时我只能让它返回 undefined。我到底在这里做错了什么?

【问题讨论】:

您忘记在 entries 函数中使用 return。您也不应该使用Number(key),这将导致NaN 用于无法转换为数字的键,例如'a' 【参考方案1】:

你可以做一个简单的for循环

var obj= "1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0
var arr=[]
for(var item in obj)
  arr.push([item,obj[item]])

console.log(arr)

【讨论】:

【参考方案2】:

首先让我们分析您的代码并发现一些错误,然后我们将专注于解决方案。

function entries(obj) 
  var result = Object.keys(obj).map(function(key) 
    return [Number(key), obj[key]];
  );

console.log(
  entries(obj = "1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0)
);

在您的代码中,函数entries 不返回任何值。因此,console.log() 将返回 undefined。我们可以用return 替换var result = 来解决这个问题。所以现在你的entries 函数返回一个基于你的对象obj 的数组。像这样:

function entries(obj) 
  return Object.keys(obj).map(function(key) 
    return [Number(key), obj[key]];
  );

console.log(
  entries(obj = 
    "1": 5,
    "2": 7,
    "3": 0,
    "4": 0,
    "5": 0,
    "6": 0,
    "7": 0,
    "8": 0,
    "9": 0,
    "10": 0,
    "11": 0,
    "12": 0
  )
);

现在我们可以稍微优化一下,让我们定义两个对象:objAobjB。第一个将是您的第一个示例。

let objA =  a: 1, b: 2, c: 3 ;
let objB = "1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0;

如果您调用console.log(entries(objA)),您将收到NaN 错误,因为a 不是数字并且您正在使用Number() 方法转换key 值。让我们删除该函数调用。这将是解决方案的最终版本:

let objA =  a: 1, b: 2, c: 3 ;
let objB = "1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0;

function entries(obj) 
  return Object.keys(obj).map(function(key) 
    return [key, obj[key]];
  );


console.log(entries(objA));
console.log(entries(objB));

【讨论】:

【参考方案3】:

你忘记从entries()返回最终的result

function entries(obj) 
  var result = Object.keys(obj).map(function(key) 
      return [Number(key), obj[key]];
    );
    return result;

console.log(
  entries(obj = "1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0)
  );

【讨论】:

以上是关于不使用 Object.entries() 返回键值对数组的数组的主要内容,如果未能解决你的问题,请参考以下文章

Object.entries() 数组变对象

Object.keys(),Object.values(),Object.entries()

在 Object.entries 上运行 forEach 不会返回与 for 循环相同的内容

ES5对象新增的方法

Object.keys(),Object.values(),Object.entries()

Object.entries()但是对象而不是数组