如何返回属性与数组匹配的对象数组?

时间:2018-12-16 07:11:12

标签: javascript vue.js

我有一个像这样的数组

array = [
  { name: "john", tag: ["tag1", "tag2"] },
  { name: "doe", tag: ["tag2"] },
  { name: "jane", tag: ["tag2", "tag3"] }
];

我想获得一个包含“ tag2”和“ tag3”的对象的新数组,但不仅包含“ tag2”或“ tag1”和“ tag2”。

结果应为:

newArray = [{ name: "jane", tag: ["tag2", "tag3"] }];

我尝试通过以下过程进行操作:

tags = ["tag2", "tag3"];
newArray = [];
tags.forEach(t => {
  array.forEach(data => {
    data.tag.forEach(item => {
      if (item === t) {
        newArray.push(data);
      }
    });
  });
});

但是我得到了所有物品。

3 个答案:

答案 0 :(得分:2)

如果我对您的理解正确,则希望搜索顶级数组,以查找其tag属性是与['tag2', 'tag3']完全匹配的数组的所有项目。

您可以根据上述条件通过filtering阵列来实现此目的。

这是一种方法:

 
const array = [
  {
    name: 'john',
    tag: ['tag1', 'tag2']
  },
  {
    name: 'doe',
    tag: ['tag2']
  },
  {
    name: 'jane',
    tag: ['tag2', 'tag3']
  }
];

const tagsToMatchOn = ['tag2', 'tag3'];

// find all elements who's tag property exactly matches
// the above tags (in presence, not necessarily in order)
const newArray = array.filter(item => (
  item.tag.length === tagsToMatchOn.length && 
  tagsToMatchOn.every(t => item.tag.includes(t))
));

console.log(newArray);

如果相反,您想查找所有tag属性是包含所有['tag2', 'tag3']的数组但还可以包含其他标签的项目,则可以尝试以下操作:

const array = [
  {
    name: 'john',
    tag: ['tag1', 'tag2']
  },
  {
    name: 'doe',
    tag: ['tag2']
  },
  {
    name: 'jane',
    tag: ['tag2', 'tag3']
  }
];

const tagsToMatchOn = ['tag2', 'tag3'];

// find all elements who's tag property includes
// all of the above tags but can also contain others
const newArray = array.filter(item =>
  tagsToMatchOn.every(t => item.tag.includes(t))
);

console.log(newArray);

答案 1 :(得分:0)

这可能不是最优雅的解决方案,但它确实会返回您想要的内容。

array = [{name:'john',
          tag: ['tag1','tag2'] 
         },
         {name:'doe',
          tag: ['tag2'] 
         },
         {name:'jane',
          tag: ['tag2','tag3'] 
         }
        ];

const newArray = [];
for (let index = 0; index < array.length; index++) {
    if(array[index].tag[0] === 'tag2' && array[index].tag[1] === 'tag3') {
        newArray.push(array[index])
    }
}

或者如果您想更多地使用es6:

array.forEach(element => {
  if(element.tag[0] === 'tag2' && element.tag[1] === 'tag3') {
    newArray.push(element)
  }
});

答案 2 :(得分:0)

您可以这样做

借助filterevery

基本上,我在这里要做的是首先要遍历arr的每个元素(使用过滤器)。通过使用我正在检查的每一项,元素的tag属性是否包含我们需要的所有标签。如果有的话,我们是否将其包含在最终输出中?

let arr = [{name:'john',
          tag: ['tag1','tag2'] 
         },
         {name:'doe',
          tag: ['tag2'] 
         },
         {name:'jane',
          tag: ['tag2','tag3'] 
         }
        ];
let tags = ['tag2','tag3'];
let op = arr.filter(e=> tags.every(el=> e.tag.includes(el)));
console.log(op);