Javascript 在对象数组的多个属性中获取最接近的较大值

Javascript 在对象数组的多个属性中获取最接近的较大值,javascript,sorting,lodash,Javascript,Sorting,Lodash,我有这个对象数组 var priceArray = [ { "foo": 1, "bar": 2, "price": 3 }, { "foo": 2, "bar": 123, "price": 124 }, { "foo": 2, "bar": 2, "price": 5 }, { "foo": 112, "bar": 2, "price": 75 }, { "foo": 2, "bar": 3, "price": 5 }, { "foo": 3, "bar": 2,

我有这个对象数组

var priceArray = [ 
  { "foo": 1, "bar": 2, "price": 3 },
  { "foo": 2, "bar": 123, "price": 124 },
  { "foo": 2, "bar": 2, "price": 5 },
  { "foo": 112, "bar": 2, "price": 75 },
  { "foo": 2, "bar": 3, "price": 5 },
  { "foo": 3, "bar": 2, "price": 3 },
  { "foo": 3, "bar": 4, "price": 7 },
  { "foo": 4, "bar": 3, "price": 4 },
  { "foo": 4, "bar": 4, "price": 6 }
];
var dataArray = [ 
  { foo: 0.25, bar: 1 },
  { foo: 0.5, bar: 1 },
  { foo: 1, bar: 1 },
  { foo: 1, bar: 2 },
  { foo: 2, bar: 1 },
  { foo: 2, bar: 2 },
  { foo: 2, bar: 4 },
  { foo: 3, bar: 2 },
  { foo: 4, bar: 1 },
  { foo: 4, bar: 2 },
  { foo: 4, bar: 4 },
];
我有另一个对象数组

var priceArray = [ 
  { "foo": 1, "bar": 2, "price": 3 },
  { "foo": 2, "bar": 123, "price": 124 },
  { "foo": 2, "bar": 2, "price": 5 },
  { "foo": 112, "bar": 2, "price": 75 },
  { "foo": 2, "bar": 3, "price": 5 },
  { "foo": 3, "bar": 2, "price": 3 },
  { "foo": 3, "bar": 4, "price": 7 },
  { "foo": 4, "bar": 3, "price": 4 },
  { "foo": 4, "bar": 4, "price": 6 }
];
var dataArray = [ 
  { foo: 0.25, bar: 1 },
  { foo: 0.5, bar: 1 },
  { foo: 1, bar: 1 },
  { foo: 1, bar: 2 },
  { foo: 2, bar: 1 },
  { foo: 2, bar: 2 },
  { foo: 2, bar: 4 },
  { foo: 3, bar: 2 },
  { foo: 4, bar: 1 },
  { foo: 4, bar: 2 },
  { foo: 4, bar: 4 },
];
我想在dataArray中添加
price
,其中price行
foo
bar
的值在
priceArray
中最接近且更大

例如,过滤后的数据应该是这样的

var filterDataArray = [ 
  { foo: 0.25, bar: 1, price: 3 },
  { foo: 0.5, bar: 1, price: 3 },
  { foo: 1, bar: 1, price: 3 },
  { foo: 1, bar: 2, price: 3 },
  { foo: 2, bar: 1, price: 5 },
  { foo: 2, bar: 2, price: 5 },
  { foo: 2, bar: 4, price: 7 },
  { foo: 3, bar: 2, price: 3 },
  { foo: 4, bar: 1, price: 4 },
  { foo: 4, bar: 2, price: 4 },
  { foo: 4, bar: 4, price: 6 },
];
如果我使用
foo
priceArray
进行排序,并使用这些代码对
bar
值进行排序,然后使用
dataArray
对该数组进行筛选。所以,我没有得到我的解决方案。像-

priceArray = priceArray.sort(function(a, b) {
  return a.foo - b.foo || a.bar - b.bar;
});
  or
priceArray = _.sortBy(( _.sortBy(priceArray, 'bar')), 'foo');
  or
priceArray = _.orderBy(priceArray, ['foo', 'bar'], ['asc', 'asc']);

// create new data array with price
const dataNewArray = [];
dataArray.map(dataObj => {
  const dataNewObj = {};
  for(const priceObject of priceArray) {
    if (dataObj.foo <= priceObject.foo && dataObj.bar <=  priceObject.bar) {
        dataNewObj.foo = dataObj.foo;
        dataNewObj.bar = dataObj.bar;
        dataNewObj.price = priceObject.price;
        break;
    }
  }
  dataNewArray.push(dataNewObj);
});
因此,您可以在这个对象中看到
{foo:2,bar:4,price:124}
price
应该是
7
,而不是
124


如何借助任何js特性(如Lodash)或任何算法来解决我的问题。我在StackOverflow上尝试了很多解决方案,但是对于object中的单个属性,我尝试了最大的解决方案。

您需要根据项目的几何距离进行排序,然后选择第一个匹配的

var priceArray=[{foo:1,bar:2,price:3},{foo:2,bar:123,price:124},{foo:2,bar:2,price:75},{foo:112,bar:2,price:75},{foo:2,bar:3,price:5},{foo:3,bar:2,price:3},{foo:3,bar:4,bar:3,price:4,price:6},
dataArray=[{foo:0.25,bar:1},{foo:0.5,bar:1},{foo:1,bar:2},{foo:2,bar:1},{foo:2,bar:2},{foo:2,bar:4},{foo:3,bar:2},{foo:4,bar:1},{foo:4,bar:4},
结果;
priceArray.sort((a,b)=>
(Math.pow(a.foo,2)+Math.pow(a.bar,2))-(Math.pow(b.foo,2)+Math.pow(b.bar,2))
);
结果=dataArray.map({foo,bar})=>({
福,
酒吧,
price:priceArray.find(o=>o.foo>=foo&&o.bar>=bar)。price
}));
console.log(结果);//结果
console.log(priceArray);//排序后的数组
。作为控制台包装{最大高度:100%!重要;顶部:0;}