按对象值数组过滤值数组

时间:2020-04-19 12:42:56

标签: javascript ecmascript-6 lodash

在Javascript中,我们有一个数组:

let arr1 = [1, 2, 3, 4, 5];

...以及对象数组:

let arr2 = [ {name: "banana", id: 1},
             {name: "mango", id: 3} ];

我想从arr1的{​​{1}}的id = arr2的值中删除所有元素,并返回这样的数组:

arr1

这是我尝试过的方法,但似乎不起作用。

[2, 4, 5]

我该如何实现?我可以使用let newArr = arr1.filter( x => !arr2.includes(e => e.id === x) ) 以及ES6。

3 个答案:

答案 0 :(得分:3)

您可以先创建 id age 的临时目录,然后将public class ShopAdapter extends BaseAdapter { @Override public int getCount() { return Image1.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = getLayoutInflater().inflate(R.layout.itemlist, null); ((ImageView) convertView.findViewById(R.id.imgItem1)).setImageResource(Image1[position]); ((TextView) convertView.findViewById(R.id.tvName1)).setText(Name1[position]); ((TextView) convertView.findViewById(R.id.tvDescription1)).setText(Description1[position]); convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //need a seperate Statement right here if (getCount() == 1) { if (points >= 10) { updateLps1(10); updatePoints1(10); save(); } else { (new AlertDialog.Builder(MainActivity.this)).setMessage("You need more Heals!").show(); } } } }); return convertView; } } filter()

一起使用

includes()

答案 1 :(得分:3)

.includes()方法不允许您将方法传递给它来定义相等性。您可以改用.some(),它允许您指定以下内容:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [
  {name: "banana", id: 1},
  {name: "mango", id: 3}
];

const newArr = arr1.filter(x => !arr2.some(e => e.id === x))
console.log(newArr);

一种更有效的方法是从数组中的对象中获取所有id属性,然后将其放入Set中以进行快速查找。然后像这样将.filter().has()一起使用:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [
  {name: "banana", id: 1},
  {name: "mango", id: 3}
];

const idSet = new Set(arr2.map(({id}) => id));
const newArr = arr1.filter(x => !idSet.has(x))
console.log(newArr);

答案 2 :(得分:1)

let arr1 = [1, 2, 3, 4, 5];

let arr2 = [ {name: "banana", id: 1},
             {name: "mango", id: 3} ];

arr1.map((item,index) => 
  arr2.map(object => {
    if(item == object.id) arr1.splice(index,1)
  })
)

console.warn(arr1) /// output [2, 4, 5]