由对象组成的数组中,对象之键表示某个物料的编号,对象之值表示对应物料的单价,现在的业务需求是判断相同的物料的单价必须统一,如果不统一则给出提示并退出业务处理流程;
模拟数据结构如下:
let _arrItemPrice = [{itemNo:'4323424', price:22}, {itemNo:'4323424', price:20}, {itemNo:'4323425', price:22}, {itemNo:'4323424', price:20}, {itemNo:'4333424', price:10}, {itemNo:'4333424', price:10}];
export const hasDifferentValueByProp = (arr, ...props) => {
let _isFlag = false; //用来标识是否有“不同”的值,初始化没有不同的值,即相同的prop1对应的prop2的值是相同的。
if (Array.isArray(arr) && arr.length > 1 && props.length === 2) {
const [_prop1, _prop2] = props;
const _arr = arr.map(i => ({ [i[_prop1]]: i[_prop2] }));
const _objProp = {};
_arr.forEach(i => {
const [_prop3] = Object.keys(i);
if (!_objProp[_prop3]) _objProp[_prop3] = [];
_objProp[_prop3].push(i[_prop3]);
})
if( Object.values(_objProp).some(i => (new Set(i)).size > 1) === true ) return true;
}
return _isFlag ;
}
## 知识点总结
```javascript
const [_prop1, _prop2] = props; //数组解构
const _arr = arr.map(i => ({ [i[_prop1]]: i[_prop2] })); //数组映射
const [_prop3] = Object.keys(i); // 取对象之键并解构赋值给_prop3
Object.values(_objProp).some(i => (new Set(i)).size > 1); // Object.values取对象之值形成集合;some在集合中寻找满足条件的子项,一旦找到即刻返回真。new Set(i)).size 可快速去除子项数组i的重复项;.size可得到没有重复项的元素个数;