如何使用javascript

时间:2018-10-09 20:30:13

标签: javascript typescript

因此在sql中,通常要做的是选择一条语句,该语句具有group by,然后具有count = 1或您拥有什么。

select bID from tableA groubBy bID having count(*) = 1

基本上,我希望使用打字稿来完成上述操作。

我也想在没有任何其他插件的情况下做到这一点,所以我真的很想在javascript中做到这一点。根据我做过的一些搜索以及访问SO的信息,我发现.reduce函数或多或少是我所需要的(据我所知)

问题是我到这里来了,而我得到的只是编译错误或转换错误。说它具有任何隐式类型或没有..等等的回调函数。

我想做的是传递一个数组。按值分组。然后看看他们有多少。如果该计数等于1,则为每个符合该条件的属性都设置一个等于true的属性,然后退出该方法。

这是我从互联网上得到的。

groupByArray(xs, key) {
    return xs.reduce(function (rv, x) {
        let v = key instanceof Function ? key(x) : x[key];
        let el = rv.find((r) => r && r.key === v);
        if (el) { el.values.push(x); } else { rv.push({ key: v, values: [x] }); }
        return rv;
    }, []);
}

PS。无论出于何种原因,人们都喜欢在这里使用非常短的变量名,这使我感到困惑。我不知道xs或rv是什么,或意味着什么,或者该变量内部是什么,所以如果您能帮助解释我粘贴的代码,那可能就是我所需要的。

再次感谢。

PPS。一个快速的数据示例是

[{bid:1,isDeleted:false},{bID:1,isDeleted:true},{bID:2,isDeleted:false},{bID:1,isDeleted:true},{bID:3,isDeleted :false},{bID:3,isDeleted:false},{bID:4,isDeleted:false}]

所以应该返回的是[{bId:1,isDeleted:false} {bID:2,isDeleted:false},{bID:4,isDeleted:false}]

下面是我可以工作的代码示例。

 var test = this.user2.scc.sA.reduce((a, b) => (a.Bid== b.Bid && !a.isDeleted) ? a : b);

编辑:快速编辑,对于造成的困扰,我深表歉意。但是我写的语法是Typescript。我知道打字稿是javascript,但在最初的问题中我提到了javascript,因为我想避免弄乱原型,因为这种方法不是最佳实践。

3 个答案:

答案 0 :(得分:3)

您可以直接按值排序,然后删除连续出现两次的所有值,而不是随后进行分组和过滤:

 function unique(array, key) {
   return array
     .sort((a, b) => a[key] > b[key] ? 1 : -1)
     .filter((el, index) => 
       (index < 1 || el[key] !== array[index - 1][key]) &&
       (index >= array.length - 1 || el[key] !== array[index + 1][key])
    );
 }

可以用作:

 unique([{bID:1},{bID:1},{bID:2},{bID:1},{bID:3},{bID:3},{bID:4}], "bID")

答案 1 :(得分:2)

您可以简化分组功能,并对该结果进行过滤以获取数组中相同的分组对象,然后对其进行过滤以仅获取长度为1的结果集。如有必要,请从阵列中取出对象。

function groupBy(array, key) {
    return array.reduce((accumulator, object) => {
        var temp = accumulator.find(array => array[0][key] === object[key]);
        if (temp) {
            temp.push(object);
        } else {
            accumulator.push([object])
        }
        return accumulator;
    }, []);
}

var array = [{ bID: 1 }, { bID: 1 }, { bID: 2 }, { bID: 1 }, { bID: 3 }, { bID: 3 }, { bID: 4 }],
    result = groupBy(array, 'bID')
        .filter(({ length }) => length === 1)
        .map(([v]) => v);
    
console.log(result);

答案 2 :(得分:1)

您应该能够使用一个reduce函数来做到这一点。

然后您可以将其扩展为可重用的功能,如其他答案所示。

function groupUnique(data, key) {
    return data.reduce((accumulator, element) => {
    const targetIdx = accumulator.findIndex(el => el[key] === element[key]);
    if (targetIdx > -1) {
        return accumulator.splice(targetIdx, 1);
    }
    return accumulator.concat(element)
}, [])}