将一个ID数组通过对象列表映射为一个字符串数组

3
var myIds = [3, 4, 2];

var myObj = [
    {id:1, name:'one'}, 
    {id:2, name:'two'},
    {id:3, name:'tree'},
    {id:4, name:'four'}];

// need to obtain ['tree', 'four', 'two']

var idsToNames= function(ids, objects) {
    var myNames = myIds.map(function(id){
        // transform id to name
        foreach(o in objects){
            if (i.id == id) 
                return o.name;
        }
    });
    return myNames;
}

将一个id数组转换成一个name数组是最优的方法吗?

1个回答

7

首先按照以下方式转换您的对象

var newMyObj = myObj.reduce(function(result, currentObject) {
  result[currentObject.id] = currentObject.name;
  return result;
}, {});

console.log(newMyObj);
// { '1': 'one', '2': 'two', '3': 'three', '4': 'four' }

您可以通过遍历数组myObj来创建newMyObj,就像这样:
var newMyObj = {};
for (var i = 0; i < myObj.length; i += 1) {
  newMyObj[myObj[i].id] = myObj[i].name;
}

现在,你可以简单地迭代myIds并从newMyObj中选择值,如下所示。
console.log(myIds.map(function(id) { return newMyObj[id]; }));
// [ 'three', 'four', 'two' ]

如果您的环境支持ECMAScript 2015的箭头函数,那么可以简洁地编写如下:
console.log(myIds.map((id) => newMyObj[id]));
// [ 'three', 'four', 'two' ]

通过将原始的myObj转换为newMyObj,您将获得恒定时间的查找。否则,您必须针对myIds中的每个元素迭代myObj数组,并且运行时复杂度将变为O(n*m)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接