在对象中找到给定数字上方和下方的元素

问题描述 投票:0回答:5

我有下面的对象

[
  {
    "value": 14,
    "name": "vwap"
  },
  {
    "value": 1,
    "name": "yopen"
  },
  {
    "value": 12,
    "name": "open"
  },
  {
    "value": 13,
    "name": "s3"
  },
  {
    "value": 9,
    "name": "fr1"
  },
  {
    "value": 10,
    "name": "fr2"
  }
]

如果我的输入是9,我需要输出为1,9 and 10,12,13如果我的输入是13,我需要输出1,9,10,12,13 and 14

输出应该是{ "value": 10, "name": "fr2" }等2个单独的对象,输出也应该排序。

我试过类似下面的东西,但它只适用于数组。

function getVal(array, val, dir) {
  for (var i=0; i < array.length; i++) {
    if (dir == true) {
      if (array[i] > val){
        return array[i-1] || 0;
      }
    } else {
      if (array[i] >= val) {
        return array[i];
      }
    }
  }
}
javascript
5个回答
2
投票

您可以使用filter()并检查给定数字是否小于或大于对象值并最终使用sort()

const arr = [ { "value": 14, "name": "vwap" }, { "value": 1, "name": "yopen" }, { "value": 12, "name": "open" }, { "value": 13, "name": "s3" }, { "value": 9, "name": "fr1" }, { "value": 10, "name": "fr2" } ]

function getParts(arr,num,min=0,max=Infinity){
  let first = arr.filter(x => num >= x.value && x.value > min && x.value < max).sort((a,b) => a.value-b.value);
  let second = arr.filter(x => num < x.value && x.value < max && x.value > min).sort((a,b) => a.value-b.value);
  return [first,second];
}

console.log(getParts(arr,9,5,12))
console.log('----------For 13--------------')
console.log(getParts(arr,13))

另一种方法是首先sort()阵列然后slice()它。

const arr = [ { "value": 14, "name": "vwap" }, { "value": 1, "name": "yopen" }, { "value": 12, "name": "open" }, { "value": 13, "name": "s3" }, { "value": 9, "name": "fr1" }, { "value": 10, "name": "fr2" } ]

function getParts(arr,num){
  let temp = arr.slice().sort((a,b) => a.value - b.value);
  let index = temp.findIndex(x => x.value === num);
  return [temp.slice(0,index+1),temp.slice(index)];
}

console.log(JSON.parse(JSON.stringify(getParts(arr,9))))
console.log('----------For 13--------------')
console.log(JSON.parse(JSON.stringify(getParts(arr,13))))

1
投票

你可以抓住并将对象推入想要的数组。

function getParts(value) {
    return data.reduce((r, o) => (r[+(o.value > value)].push(o), r), [[], []]);
}

var data = [{ value: 14, name: "vwap" }, { value: 1, name: "yopen" }, { value: 12, name: "open" }, { value: 13, name: "s3" }, { value: 9, name: "fr1" }, { value: 10, name: "fr2" }];

data.sort(({ value: a }, { value: b }) => a - b);
console.log(getParts(9));
.as-console-wrapper { max-height: 100% !important; top: 0; }

1
投票

您可以使用对象来存储结果,包含下部和上部。

然后,循环您的数组并将值与输入进行比较。您将知道在下部或上部存储元素的位置

let datas = [{"value":14,"name":"vwap"},{"value":1,"name":"yopen"},{"value":12,"name":"open"},{"value":13,"name":"s3"},{"value":9,"name":"fr1"},{"value":10,"name":"fr2"}];

function getVal(input)
{
  let result =
  {
    lowerPart: [],
    upperPart: []
  };
  
  datas.forEach((elem) =>
  {
    if (elem.value <= input)
      result.lowerPart.push(elem);
    else
      result.upperPart.push(elem);
  });
  
  return result;
}

console.log(getVal(9));

console.log(getVal(13));

1
投票

使用reduce()

var arr = [{"value":14,"name":"vwap"},{"value":1,"name":"yopen"},{"value":12,"name":"open"},{"value":13,"name":"s3"},{"value":9,"name":"fr1"},{"value":10,"name":"fr2"}]

function getVal(arr, find) {
  return arr.reduce((acc, i) => {
    acc[i.value <= find ? 'l' : 'g'].push(i)
    return acc
  }, {
    l: [],
    g: []
  })
}

console.log(getVal(arr, 9))

console.log(getVal(arr, 13))
.as-console-wrapper { max-height: 100% !important; top: 0; }

用法

let res = getVal(arr, 9)
res.l // lowerpart
res.g // greaterpart

1
投票

您可以根据需要使用过滤和排序功能。

var find = 9;
var left = arr.filter(c=>c.value <= find).sort((a,b) => a.value-b.value);
var right = arr.filter(c=>c.value > find).sort((a,b) => a.value-b.value);

var arr = [
  {
    "value": 14,
    "name": "vwap"
  },
  {
    "value": 1,
    "name": "yopen"
  },
  {
    "value": 12,
    "name": "open"
  },
  {
    "value": 13,
    "name": "s3"
  },
  {
    "value": 9,
    "name": "fr1"
  },
  {
    "value": 10,
    "name": "fr2"
  }
]
var find = 9;
var left = arr.filter(c=>c.value <= find).sort((a,b) => a.value-b.value);
var right = arr.filter(c=>c.value > find).sort((a,b) => a.value-b.value);
console.log('Less than or equal: ' + find);
console.log(left)
console.log('Greater than: ' + find);
console.log(right)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.