javascript - 将对象数组中的值与对象的响应数组进行比较

时间:2016-09-10 16:14:46

标签: javascript arrays

我正在构建一个小应用,您可以将最多10个项目添加到"包"。

将商品添加到购物袋后,会将其添加到bag []。每个项目都有id

但是,我从API调用中获取了这些项目,因此当我获得项目时,我想确保如果我已经将一个项目添加到包中,那么它并不会对包状态造成影响。

以下是我从API收到项目时所做的事情:

items.map(i => {
  i.inBag: false
});

但是,即使我已将商品添加到购物袋中,也会重置inBag。将项目添加到包中时,inBag将翻转为true。但是下次进行API调用时,它会重置为false

如何确保从API收到内容时,我还会检查i.id中的项目中是否存在bag[]

如果我在每次迭代中进行比较,我担心它会太慢,所以我想知道是否有更好的方法。

由于

2 个答案:

答案 0 :(得分:0)

试试这个;

如果bag不是对象数组

#/bin/sh

path='./path'
list="$path/*.tar.gz"
for file in `ls ./da/*.tar.gz.*`
    do
        let i++

        if [[ -f $(find $path/*.tar.gz.$i) ]]
            then
                echo "file $path/*.tar.gz.$i found."
                list="$list $path/*.tar.gz.$i"
            else
                echo "file $path/*.tar.gz.$i not found!"
        fi
    done
cat $list > full.tar.gz
tar zxvf ./full.tar.gz -C $path
# rm -rf $list

如果bag是对象数组

if(bag.indexOf(received_item_id)==-1)
{
    //write code to insert item into bag[]
}

答案 1 :(得分:0)

鉴于这些数组:

arrayA = [{id: 2003, name:"one"}, {id: 2004, name:"two"}];
arrayB = [{id: 2003, name:"foo"}, {id: 2005, name:"three"}];

要仅添加新的id值,请使用Array.prototype.concat()Array.prototype.filter()

arrayA.concat(arrayB.filter( v => !arrayA.filter(e => e.id === v.id).length ));

给出了:

[{id: 2003, name:"one"}, {id: 2004, name:"two"}, {id: 2005, name:"three"}];

更新

根据Bergi的建议,这更加清晰:

arrayA.concat(arrayB.filter( v => arrayA.every(e => e.id !== v.id) ));

这意味着:与arrayA连接arrayB中的所有元素,其中arrayA中的每个元素都保持arrayB中不存在任何id对象的条件。