javascript - 在数组对象中查找字符串值的最简洁方法?

标签 javascript arrays loops ecmascript-6 constants

所以我在一个对象(来自 API)中有一堆状态代码,返回如下:

{
  "location": [
    "HOME_ADDRESS_INCOMPLETE",
    "HOME_MISSING_ADDRESS"
  ],
  "basics": [
    "HOME_MISSING_TYPE"
  ],
  "description": [
    "HOME_MISSING_DESCRIPTION"
  ],
  "immersions": [
    "AT_LEAST_ONE_STAY_REQUIRED",
    "SIMPLE_STAY_MISSING_HOURS",
    "SIMPLE_STAY_MISSING_OFFERED_LANGUAGES",
    "TANDEM_STAY_MISSING_HOURS",
    "TANDEM_STAY_MISSING_OFFERED_LANGUAGES",
    "TANDEM_STAY_MISSING_INTERESTED_LANGUAGES",
    "TEACHER_STAY_MISSING_HOURLY_PRICE",
    "TEACHER_STAY_MISSING_OFFERED_LANGUAGES",
    "TEACHER_STAY_MISSING_WEEKLY_PACKAGES"
  ],
  "rooms": [
    "NO_ROOMS"
  ],
  "photos": [
    "AT_LEAST_ONE_HOME_IMAGE_REQUIRED"
  ],
  "pricing": [
    "MISSING_CURRENCY",
    "SERVICE_WITHOUT_PRICE",
    "DISCOUNT_WITHOUT_PERCENT",
    "ROOM_WITHOUT_PRICE"
  ]
}

键名称(如 location)与设置向导中的步骤相关,用户必须根据缺少的内容进行操作,该步骤由诸如 HOME_ADDRESS_INCOMPLETE 等常量表示>.

从该对象和一个常量(例如 MISSING_CURRENCY)开始,并返回该常量数组所属键的名称的最简洁或清晰的方法是什么?

这是我到目前为止所做的,但它所做的只是返回数组本身:

const activeStep = Object.values(HomeStatusCodes).filter(statusArray => {
  return statusArray.includes(homeActivationResponse.code)
})

最佳答案

Array#find (在该结构的键数组上,来自 Object.keys)加上 Array#indexOf 应该可以做到:

function find(value) {
  return Object.keys(data).find(function(key) {
    return data[key].indexOf(value) != -1;
  });
}

请注意,Array#find 是 ES2015 中的新功能,但可以轻松进行填充/填充。

示例:

var data = {
  "location": [
    "HOME_ADDRESS_INCOMPLETE",
    "HOME_MISSING_ADDRESS"
  ],
  "basics": [
    "HOME_MISSING_TYPE"
  ],
  "description": [
    "HOME_MISSING_DESCRIPTION"
  ],
  "immersions": [
    "AT_LEAST_ONE_STAY_REQUIRED",
    "SIMPLE_STAY_MISSING_HOURS",
    "SIMPLE_STAY_MISSING_OFFERED_LANGUAGES",
    "TANDEM_STAY_MISSING_HOURS",
    "TANDEM_STAY_MISSING_OFFERED_LANGUAGES",
    "TANDEM_STAY_MISSING_INTERESTED_LANGUAGES",
    "TEACHER_STAY_MISSING_HOURLY_PRICE",
    "TEACHER_STAY_MISSING_OFFERED_LANGUAGES",
    "TEACHER_STAY_MISSING_WEEKLY_PACKAGES"
  ],
  "rooms": [
    "NO_ROOMS"
  ],
  "photos": [
    "AT_LEAST_ONE_HOME_IMAGE_REQUIRED"
  ],
  "pricing": [
    "MISSING_CURRENCY",
    "SERVICE_WITHOUT_PRICE",
    "DISCOUNT_WITHOUT_PERCENT",
    "ROOM_WITHOUT_PRICE"
  ]
};

function find(value) {
  return Object.keys(data).find(function(key) {
    return data[key].indexOf(value) != -1;
  });
}

console.log(find("MISSING_CURRENCY"));

使用 ES2015 语法时更加简洁:

const find = value =>
  Object.keys(data).find(key => data[key].indexOf(value) != -1);

(是的,这确实是一个函数。)这是支持 ES2015 的浏览器的实时版本:

var data = {
  "location": [
    "HOME_ADDRESS_INCOMPLETE",
    "HOME_MISSING_ADDRESS"
  ],
  "basics": [
    "HOME_MISSING_TYPE"
  ],
  "description": [
    "HOME_MISSING_DESCRIPTION"
  ],
  "immersions": [
    "AT_LEAST_ONE_STAY_REQUIRED",
    "SIMPLE_STAY_MISSING_HOURS",
    "SIMPLE_STAY_MISSING_OFFERED_LANGUAGES",
    "TANDEM_STAY_MISSING_HOURS",
    "TANDEM_STAY_MISSING_OFFERED_LANGUAGES",
    "TANDEM_STAY_MISSING_INTERESTED_LANGUAGES",
    "TEACHER_STAY_MISSING_HOURLY_PRICE",
    "TEACHER_STAY_MISSING_OFFERED_LANGUAGES",
    "TEACHER_STAY_MISSING_WEEKLY_PACKAGES"
  ],
  "rooms": [
    "NO_ROOMS"
  ],
  "photos": [
    "AT_LEAST_ONE_HOME_IMAGE_REQUIRED"
  ],
  "pricing": [
    "MISSING_CURRENCY",
    "SERVICE_WITHOUT_PRICE",
    "DISCOUNT_WITHOUT_PERCENT",
    "ROOM_WITHOUT_PRICE"
  ]
};

const find = value =>
  Object.keys(data).find(key => data[key].indexOf(value) != -1);

console.log(find("MISSING_CURRENCY"));

关于javascript - 在数组对象中查找字符串值的最简洁方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41573534/

相关文章:

javascript - 通过代理发送所有 Electron HTTP请求。

c++ - 线段树数据结构中的数组大小

javascript - 如何在包含图片的 Javascript 数组中插入 HTML 标签?

javascript 调用函数作为数组元素

javascript - 两次之间添加 30 分钟间隔

java - 根据命令提示符的输入打印星星

javascript - 在 mouseout 上保持视差移动一秒钟并平稳停止

javascript - 无法通过 Javascript 中的对象调用静态方法

javascript - 为什么检查 void 0 比检查 undefined 快得多?

ios - 如何将计算属性添加到 Array<T>?