JavaScript遍历两个数组并获得单个数组

时间:2019-05-03 12:43:22

标签: javascript

我有两个数组:

var arr = [ 
  { id: 2, username: 'bill'}, 
  { id: 3, username: 'ted' }];

var b = ["ted", "bill", "john"];

我如何获得一个像这样的数组:

var finalArr = [{id: 2, username: 'bill'},{id:3, username: 'ted'}. {id:0, username: 'john'}]

如果数组b中的用户存在于arr数组中,则要添加id,如果不是id,则添加0。

我尝试了类似的方法,但是没有用

var arr = [{
    id: 2,
    username: 'bill'
  },
  {
    id: 3,
    username: 'ted'
  }
];

var b = ["ted", "bill", "john"];

var finalArr = [];

function userExists(username) {
  var a = arr.some(item => {
    if (item.username === username) {
      finalArr.push({
        username,
        id: item.id
      })
    } else {
      finalArr.push({
        username,
        id: 0
      })
    }
  })
}

b.forEach(el => {
  userExists(el)
})

console.log(finalArr)

5 个答案:

答案 0 :(得分:4)

使用mapb中循环。使用find检查username中是否存在arr。如果是,则返回对象。否则,用id: 0

返回一个新对象

var arr = [ 
  { id: 2, username: 'bill'}, 
  { id: 3, username: 'ted' }];

var b = ["ted", "bill", "john"];

const output = b.map(username => {
  const found = arr.find(a => a.username === username);
  return found || { username, id: 0 }
})

console.log(output)

答案 1 :(得分:1)

您可以使用map和find来构建新的数组,如

var arr = [{
    id: 2,
    username: 'bill'
  },
  {
    id: 3,
    username: 'ted'
  }
];

var b = ["ted", "bill", "john"];


const finalArr = b.map(username => {
  const find = arr.find(o => o.username === username);
  return find ? find : { id: 0, username }
})

console.log(finalArr)

答案 2 :(得分:1)

您可以选择Set并通过查看设置进行过滤并删除访问过的项目。最后,缺少物品。

此解决方案代表给定数据的顺序,并按names数组的顺序添加丢失的对象。

var data = [{ id: 42, username: 'foo' }, { id: 2, username: 'bill' }, { id: 3, username: 'ted' }],
    names = ["ted", "bill", "john"],
    missing = new Set(names),
    result = data
        .filter(({ username }) => missing.delete(username))
        .concat(Array.from(missing, username => ({ id: 0, username })));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:0)

您可以使用 reduce 方法做到这一点。

b.reduce((result, elm) => {
    const userObj = arr.find((a) => a.username === elm);
    if(userObj) {
        result.push(userObj)
    } else {
        result.push({
            id: 0,
            username: elm
        });
    }
    return result;
}, []);

检查https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce,了解有关reduce的更多详细信息。

答案 4 :(得分:0)

您可以创建一个虚拟数组以存储结果,然后使用find查找现有数组。如果找不到,请创建一个虚拟对象,然后将其推入数组。

var arr = [ 
  { id: 2, username: 'bill'}, 
  { id: 3, username: 'ted' }];

var b = ["ted", "bill", "john"];
myArr = [];
b.forEach(function(element) {
var el=arr.find(x => x.username === element);
  if(el){
    myArr.push(el);
  }else{
    var dummy={};
    dummy.id=0;
    dummy.username=element;
    myArr.push(dummy);
  }
});
console.log(myArr);