var x = [{a:1, b:4,c:5}, {a:1, b:2,c:7}];
var y = [{a:1, b:2,c:6}, {a:1, b:2,c:8}];
我想基于前2个密钥进行比较,即a,b,如果它不相等则得到索引。在上面的示例中,输出应该被取为0,因为b值是nt相等。我们如何在javascript或Lodash中实现?谢谢。
答案 0 :(得分:3)
因此,您需要一个比较函数,该函数将比较您希望其中两个属性a
和b
不相等的对象的索引的对象数组。
下面的实现返回这样的索引(0-base)如果退出则返回-1
。
function compare(x,y){
for(let i=0;i<x.length && i<y.length;i++){
if(x[i].a!=y[i].a || x[i].b!=y[i].b)
return i;
}
return -1;
}
var x = [{a:1, b:4,c:5}, {a:1, b:2,c:7}];
var y = [{a:1, b:2,c:6}, {a:1, b:2,c:8}];
console.log(compare(x,y)); //0
y = [{a:1, b:4,c:6}, {a:1, b:2,c:8}];
console.log(compare(x,y));//-1
y = [{a:1, b:4,c:6}, {a:1, b:3,c:8}];
console.log(compare(x,y));//1
希望你想要。
答案 1 :(得分:0)
如果要在特定条件下过滤数组,可以使用filter()
:
y.filter(d => d.a !== d.b);
Lodash:
_.filter(y, d => d.a !== d.b);
答案 2 :(得分:0)
假设您想通过前两个键比较数组中的两个对象,这是一个工作示例。请随意详细说明。
var x = [{a:1, b:4,c:5},{a:1, b:2,c:7}];
var y = [{a:1, b:2,c:6}, {a:1, b:2,c:8}];
function customizer(obj1, obj2) {
const [a, b] = Object.keys(obj1).slice(0, 2);
return obj1[a] === obj2[a] && obj1[b] === obj2[b];
}
xIsEqual = _.isEqualWith(x[0], x[1], customizer);
yIsEqual = _.isEqualWith(y[0], y[1], customizer);
console.log(xIsEqual); // false
console.log(yIsEqual); // true
答案 3 :(得分:0)
您不能依赖对象键的顺序,因为对象键的迭代是依赖于实现的。它可能因浏览器而异。
阅读此note。
例如,运行以下代码:
const obj1 = { a: 'a', 100: 'b', 2: 'c' };
console.log('object literal', Object.keys(obj1));
// at least in chrome it would be ["2", "100", "a"]
const obj2 = {};
obj2['a'] = 'a';
obj2['100'] = 'b';
obj2['2'] = 'b';
console.log('object with keys added in a specific order', Object.keys(obj2));
// same ["2", "100", "a"]
&#13;