因此在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,因为我想避免弄乱原型,因为这种方法不是最佳实践。
答案 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)
}, [])}