使用对象列表将ID数组映射到字符串数组

Ser*_*rge 2 javascript arrays object

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;
}
Run Code Online (Sandbox Code Playgroud)

它是将id数组转换为名称数组的最佳方法吗?

the*_*eye 5

首先像这样转换你的对象

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' }
Run Code Online (Sandbox Code Playgroud)

您实际上可以newMyObj通过迭代数组来创建myObj,就像这样

var newMyObj = {};
for (var i = 0; i < myObj.length; i += 1) {
  newMyObj[myObj[i].id] = myObj[i].name;
}
Run Code Online (Sandbox Code Playgroud)

现在,你可以简单地重复myIds,并挑选值从newMyObj,像这样

console.log(myIds.map(function(id) { return newMyObj[id]; }));
// [ 'three', 'four', 'two' ]
Run Code Online (Sandbox Code Playgroud)

如果您的环境支持ECMAScript 2015的Arrow功能,则可以简洁地编写

console.log(myIds.map((id) => newMyObj[id]));
// [ 'three', 'four', 'two' ]
Run Code Online (Sandbox Code Playgroud)

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