在lodash中比较和返回索引

时间:2018-02-10 22:46:19

标签: javascript reactjs lodash

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中实现?谢谢。

4 个答案:

答案 0 :(得分:3)

因此,您需要一个比较函数,该函数将比较您希望其中两个属性ab不相等的对象的索引的对象数组。

下面的实现返回这样的索引(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

例如,运行以下代码:

&#13;
&#13;
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;
&#13;
&#13;