js一维数组匹配二维数组

sleep_SBD
  • 225
var a = ["1", "3", "5"];
var b = [
    { id: "1", name: "商务" },
    { id: "2", name: "健身" },
    { id: "3", name: "游泳" },
    { id: "4", name: "餐饮" },
    { id: "5", name: "休闲" },
    { id: "6", name: "住宿" },

];

如何匹配出[{ id: "1", name: "商务" },{ id: "3", name: "游泳" },{ id: "5", name: "休闲" },]

回复
阅读 766
7 个回答
✓ 已被采纳
var arr = b.filter(e=>{
 return a.includes(e.id) 
})
 
 console.log(arr)  

clipboard.png


var b = [
  { id: "1", name: "商务" },
  { id: "2", name: "健身" },
  { id: "3", name: "游泳" },
  { id: "4", name: "餐饮" },
  { id: "5", name: "休闲" },
  { id: "6", name: "住宿" },
];
var new_b = b.filter(function(val, ind) {
  if(
    val.id === '1' ||
    val.id === '3' ||
    val.id === '5'
  ){
    return true
  }
})
console.log(new_b);
var a = ['1', '3', '5'];
var b = [
  {id: '1', name: '商务'},
  {id: '2', name: '健身'},
  {id: '3', name: '游泳'},
  {id: '4', name: '餐饮'},
  {id: '5', name: '休闲'},
  {id: '6', name: '住宿'},

];
var c = b.filter(({id}) => a.includes(id));
console.log(c)

先给出代码吧,就一行代码

b.filter(item=>a.indexOf(item.id)!==-1)

再解释下原理,就是遍历 b 的 id,逐个放进 a.indexOf(item.id) 中。如果b的当前遍历到的id(item.id)在 a中存在(indexOf不等于-1,就是存在),就会返回结果。

下面是运行的结果

clipboard.png

const mapData = (a, b) => {
  return b.filter(item => {
      return a.includes(item.id)
    })
}
var a = ["1", "3", "5"];
var b = [
  { id: "1", name: "商务" },
  { id: "2", name: "健身" },
  { id: "3", name: "游泳" },
  { id: "4", name: "餐饮" },
  { id: "5", name: "休闲" },
  { id: "6", name: "住宿" },

];

function match(arr1, arr2) {
  var newArr = []
  arr2.forEach(function (item) {
    if (arr1.indexOf(item.id) !== -1) {
      newArr.push(item)
    }
  })
  return newArr
}
console.log(match(a, b))

这样可以不?

谢邀。

不过楼上都已经回答了,这里提一下兼容性。大概思路就是过滤一个数组,可以直接使用filter方法,过滤的条件就是根据id

一般有两个方式indexOfinclude,这里需要注意include不支持ie,推荐用indexOf

clipboard.png

filterES5里面的方法,如果有不兼容的浏览器,可以使用如下Polyfill代码来扩展

if (typeof Array.prototype.filter != "function") {
  Array.prototype.filter = function (fn, context) {
    var arr = [];
    if (typeof fn === "function") {
       for (var k = 0, length = this.length; k < length; k++) {
          fn.call(context, this[k], k, this) && arr.push(this[k]);
       }
    }
    return arr;
  };
}
你知道吗?

宣传栏